我"继承"以下示例代码。这不是实际的代码,而是它的本质
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数据库。需要做一些重构,现在我坚持这个。两个不同的引擎是否可以在内存数据库中看到相同的内容?
答案 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()