我有一个Flask应用程序,我想使用SQLAlchemy Core(即我明确不想要使用ORM),类似于Flask doc中描述的“第四种方式” :
http://flask.pocoo.org/docs/patterns/sqlalchemy/#sql-abstraction-layer
我想知道推荐的模式是什么:
如何连接到我的数据库(我可以在connection
中的g.db
变量中简单地存储before_request
个实例吗?)
如何执行反射以检索现有数据库的结构(如果可能,我希望避免显式创建任何“模型/表类”)
答案 0 :(得分:9)
正确:您将为每个线程创建一个连接,并使用threadlocal变量访问它。像往常一样,SQLAlchemy已经考虑过这个用例并为您提供了一种模式:Using the Threadlocal Execution Strategy
db = create_engine('mysql://localhost/test', strategy='threadlocal')
db.execute('SELECT * FROM some_table')
注意:如果我没有弄错的话,该示例似乎混淆了名称db
和engine
(也应该是db
,我想)。
我认为您可以放心地忽略文档中发布的注释,因为这显然是您想要的。只要每个事务范围都链接到一个线程(与通常的烧瓶设置一样),您就可以安全地使用它。只是不要开始搞乱无线的东西(但无论如何都要烧瓶扼流圈)。
如Reflecting Database Objects中所述,反思非常简单。由于您不想手动创建所有表,因此SQLAlchemy也提供了一种很好的方法:Reflecting All Tables at Once
meta = MetaData()
meta.reflect(bind=someengine)
users_table = meta.tables['users']
addresses_table = meta.tables['addresses']
我建议你查看有关反思的完整章节。