仅使用 SQLAlchemy Core 的 Flask 应用模式

11 投票
1 回答
3308 浏览
提问于 2025-04-17 20:40

我有一个Flask应用程序,我想用SQLAlchemy Core来操作数据库(也就是说,我想使用ORM)。这和Flask文档中提到的“第四种方式”类似:

http://flask.pocoo.org/docs/patterns/sqlalchemy/#sql-abstraction-layer

我想知道在以下方面推荐的做法是什么:

  1. 如何连接到我的数据库(我可以在before_request中简单地把一个connection实例存储在g.db变量里吗?)

  2. 如何进行反射以获取我现有数据库的结构(如果可以的话,我希望避免显式创建任何“模型/表类”)

1 个回答

10
  1. 正确的做法是:每个线程创建一次连接,然后通过一个线程本地变量来访问它。SQLAlchemy已经考虑到了这种情况,并为你提供了一个模式:使用线程本地执行策略

     db = create_engine('mysql://localhost/test', strategy='threadlocal')
     db.execute('SELECT * FROM some_table')
    

注意:如果我没记错的话,例子中似乎把 dbengine 的名字搞混了(我觉得它们应该都是 db)。

我认为你可以放心地忽略文档中提到的注意事项,因为这正是你想要的。只要每个事务范围都和一个线程关联(就像通常的flask设置那样),你就可以安全使用这个。只要别去搞那些没有线程的东西(不过flask本身也不支持那种情况)。

  1. 反射(Reflection)其实很简单,具体可以参考反射数据库对象。因为你不想手动创建所有的表,SQLAlchemy也提供了一个很好的方法:一次性反射所有表

     meta = MetaData()
     meta.reflect(bind=someengine)
     users_table = meta.tables['users']
     addresses_table = meta.tables['addresses']
    

我建议你查看一下关于反射的完整章节。

撰写回答