A SQLAlchemy dependency for nameko, enabling services to interface with a relational database.
from nameko_sqlalchemy import Session
from .models import Model, DeclarativeBase
class Service(object):
session = Session(DeclarativeBase)
@entrypoint
def write_to_db(self):
model = Model(...)
self.session.add(model)
self.session.commit()
@entrypoint
def query_db(self):
queryset = self.session.query(Model).filter(...)
...
You may use any database driver compatible with SQLAlchemy provided it is safe to use with eventlet. This will include all pure-python drivers. Known safe drivers are:
Pytest fixtures to allow for easy testing are available.
db_session
fixture (which depends ondb_connection
fixture) will instantiate test database and tear it down at the end of each test.model_base
fixture can be overridden to provide customdeclarative_base
.db_engine_options
fixture can be overriden to provide additional keyword arguments tosqlalchemy.create_engine
.
import pytest
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
class Base(object):
pass
DeclarativeBase = declarative_base(cls=Base)
class User(DeclarativeBase):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String)
@pytest.fixture(scope='session')
def model_base():
return DeclarativeBase
@pytest.fixture(scope='session')
def db_engine_options():
return dict(client_encoding='utf8')
def test_users(db_session):
user = User(id=1, name='Joe')
db_session.add(user)
db_session.commit()
saved_user = db_session.query(User).get(user.id)
assert saved_user.id > 0
assert saved_user.name == 'Joe'
When running tests you can pass database test url with --test-db-url
parameter or override db_url
fixture.
By default SQLite memory database will be used.
py.test test --test-db-url=sqlite:///test_db.sql