仅使用 SQLAlchemy Core 的 Flask 应用模式
我有一个Flask应用程序,我想用SQLAlchemy Core来操作数据库(也就是说,我不想使用ORM)。这和Flask文档中提到的“第四种方式”类似:
http://flask.pocoo.org/docs/patterns/sqlalchemy/#sql-abstraction-layer
我想知道在以下方面推荐的做法是什么:
如何连接到我的数据库(我可以在
before_request
中简单地把一个connection
实例存储在g.db
变量里吗?)如何进行反射以获取我现有数据库的结构(如果可以的话,我希望避免显式创建任何“模型/表类”)
1 个回答
10
正确的做法是:每个线程创建一次连接,然后通过一个线程本地变量来访问它。SQLAlchemy已经考虑到了这种情况,并为你提供了一个模式:使用线程本地执行策略
db = create_engine('mysql://localhost/test', strategy='threadlocal') db.execute('SELECT * FROM some_table')
注意:如果我没记错的话,例子中似乎把 db
和 engine
的名字搞混了(我觉得它们应该都是 db
)。
我认为你可以放心地忽略文档中提到的注意事项,因为这正是你想要的。只要每个事务范围都和一个线程关联(就像通常的flask设置那样),你就可以安全使用这个。只要别去搞那些没有线程的东西(不过flask本身也不支持那种情况)。
反射(Reflection)其实很简单,具体可以参考反射数据库对象。因为你不想手动创建所有的表,SQLAlchemy也提供了一个很好的方法:一次性反射所有表
meta = MetaData() meta.reflect(bind=someengine) users_table = meta.tables['users'] addresses_table = meta.tables['addresses']
我建议你查看一下关于反射的完整章节。