使用(仅)SQLAlchemy Core的Flask应用程序模式

时间:2014-03-03 20:37:54

标签: python sqlalchemy flask

我有一个Flask应用程序,我想使用SQLAlchemy Core(即我明确想要使用ORM),类似于Flask doc中描述的“第四种方式” :

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

我想知道推荐的模式是什么:

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

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

1 个答案:

答案 0 :(得分:9)

  1. 正确:您将为每个线程创建一个连接,并使用threadlocal变量访问它。像往常一样,SQLAlchemy已经考虑过这个用例并为您提供了一种模式:Using the Threadlocal Execution Strategy

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

    注意:如果我没有弄错的话,该示例似乎混淆了名称dbengine(也应该是db,我想)。

    我认为您可以放心地忽略文档中发布的注释,因为这显然是您想要的。只要每个事务范围都链接到一个线程(与通常的烧瓶设置一样),您就可以安全地使用它。只是不要开始搞乱无线的东西(但无论如何都要烧瓶扼流圈)。

  2. 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']
    

    我建议你查看有关反思的完整章节。