首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flask和SQLAlchemy以及Flask对象

Flask和SQLAlchemy以及Flask对象
EN

Stack Overflow用户
提问于 2012-11-18 21:32:36
回答 1查看 4.5K关注 0票数 3

这是我第一次使用这个环境。

我愿意使用的SQLAlchemy部分正是允许我使用带有autoload = True的表对象来查询数据库的部分。我这样做是因为我的表已经存在于DB (mysql服务器)中,并且不是通过定义flask模型创建的。

我已经看过了所有的文档,但我似乎找不到答案。下面是一些代码:

代码语言:javascript
复制
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()

现在,您可能想知道我为什么要使用名为metadata的全局变量。好的,还有更多的代码:

代码语言:javascript
复制
@app.route('/test/<int:id>')
def test(test_result_id):

    testTable = Table('test_table', metadata , autoload=True)

正如您所看到的,我需要该对象是全局的,以便从函数中访问它。

另外,我在每个需要它的函数中声明了相同的var testTable。我有种感觉,这不是正确的方法。我找不到对我这种情况的最佳实践建议。

谢谢大家!

EN

回答 1

Stack Overflow用户

发布于 2012-12-10 14:43:04

你在SQLAlchemy文档中见过this snippet吗?

也许这能行得通:

代码语言:javascript
复制
# 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中创建一个新的引擎-应用创建是一个更合适的地方。

如果您的情况非常特殊,则每个请求可能需要一个引擎,在这种情况下,您应该考虑ThreadLocalMetaData类。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13440610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档