这是我第一次使用这个环境。
我愿意使用的 SQLAlchemy 部分只是允许我使用 autoload = True 的表对象查询数据库的部分。我这样做是因为我的表已经存在于数据库(mysql 服务器)中,并且不是通过定义 Flask 模型创建的。
我已经浏览了所有文档,但似乎没有找到答案。这是一些代码:
app = Flask(__name__)
app.config.from_object(__name__)
metadata = None
def connect_db():
engine = create_engine(app.config['DATABASE_URI'])
global metadata
metadata = MetaData(bind=engine)
return engine.connect()
@app.before_request
def before_request():
g.db = connect_db()
@app.teardown_request
def teardown_request(exception):
g.db.close()
现在你可能想知道为什么我使用名为元数据的全局变量。好的,还有一些代码:
@app.route('/test/<int:id>')
def test(test_result_id):
testTable = Table('test_table', metadata , autoload=True)
正如您所看到的,我需要该对象是全局的,以便从函数内访问它。
另外,我在每个需要它的函数中声明相同的 var testTable 。我感觉这不是正确的方法。对于像我这样的案例,我找不到任何最佳实践建议。
谢谢大家!
你见过吗这个片段 http://docs.sqlalchemy.org/en/rel_0_8/core/schema.html#reflecting-all-tables-at-once在 SQLAlchemy 文档中?
也许这会起作用:
# This is fine as a global global
metadata = MetaData()
@app.before_first_request
def autoload_tables():
meta.reflect(bind=g.db.bind)
@app.route('/')
def index():
users_table = meta.tables['users']
这样,您的表每个进程仅反映一次,这可能就是您想要的。请注意,您的引擎也应该是全局的,因此您无需在 @app.before_request 中创建新引擎 - 应用程序创建是更合适的地方。
如果您的情况非常特殊,您可能每个请求都需要一台发动机,在这种情况下您应该考虑线程本地元数据 http://docs.sqlalchemy.org/en/rel_0_8/core/schema.html#sqlalchemy.schema.ThreadLocalMetaData class.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)