从sqlalchemy

时间:2017-01-26 14:13:38

标签: sqlite sqlalchemy

我"继承"以下示例代码。这不是实际的代码,而是它的本质

Base = declarative_base()
engine1 = create_engine('sqlite://')
engine2 = create_engine('sqlite://')

Session1 = sessionmaker(bind=engine1, autocommit=False)
Session2 = sessionmaker(bind=engine2, autocommit=False)

ScopedSession1 = scoped_session(Session1)
ScopedSession2 = scoped_session(Session2)

scoped_session1 = ScopedSession1()
scoped_session1 = ScopedSession2()

我有一堆继承自Base的模型,并使用以下

创建
Base.metadata.create_all(bind=engine1)

如果我这样做

scoped_session1.query(MyModel).all()

我得到一个空列表,因为没有插入任何内容。如果我做

scoped_session_2.query(MyModel).all() 

我得到了

OperationalError: (sqlite3.OperationalError) no such table: reasons [SQL: u'SELECT reasons.id AS reasons_id, reasons.reason_text AS reasons_reason_text \nFROM reasons']

我猜他们在内存中创建了不同的数据库,所以这些表只在第一个(engine1)中创建。我在我的应用程序的测试用例中使用memmory数据库。需要做一些重构,现在我坚持这个。两个不同的引擎是否可以在内存数据库中看到相同的内容?

1 个答案:

答案 0 :(得分:0)

我们知道create_engine()返回Engine对象的实例。那么,如果定义一个函数,该函数返回使用相同参数创建的先前实例的缓存引用:

import weakref
_engine_cached = weakref.WeakValueDictionary()
def get_engine(engine):
    if engine not in _engine_cached:
        e = create_engine(engine)
        _engine_cached[engine] = e
    else:
        e = _engine_cached[engine]
    return e

engine1 = get_engine('sqlite://')
engine2 = get_engine('sqlite://')

现在您可以scoped_session_2.query(MyModel).all()