【问题标题】:Flask-sqlalchemy connecting to an existing databaseFlask-sqlalchemy 连接到现有数据库
【发布时间】:2018-02-09 22:54:41
【问题描述】:

我正在尝试连接到现有数据库,但不确定将db.Model.metadata.reflect(db.engine) 放在哪里,如下面的question 所示。

我的烧瓶应用程序的结构如下:

我不确定在哪里添加db.Model.metadata.reflect(db.engine)

intel\__init__.py我正在使用一个函数来创建应用程序:

def create_app():
    app = Flask(__name__)
    app.config.from_object('config')
    register_extensions(app)
    register_blueprints(app)
    return app

在我的 register_extensions 函数中:

def register_extensions(app):
    db.init_app(app)
    db.Model.metadata.reflect(db.engine)
    return None

my model\sam.py

from intel.database import db


class Sam(db.Model):
    __table__ = db.Model.metadata.tables['sam_monthly_extract']

现在,当我这样做时,我得到一个错误:

Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from intel import create_app
  File "C:\Users\spitf\G2XChange\intel_app\intel\__init__.py", line 6, in <module>
    from intel.views.sam_view import sam_blueprint
  File "C:\Users\spitf\G2XChange\intel_app\intel\views\sam_view.py", line 3, in <module>
    from intel.models.sam import Sam
  File "C:\Users\spitf\G2XChange\intel_app\intel\models\sam.py", line 4, in <module>
    class Sam(db.Model):
  File "C:\Users\spitf\G2XChange\intel_app\intel\models\sam.py", line 5, in Sam
    __table__ = db.Model.metadata.tables['sam_monthly_extract']
KeyError: 'sam_monthly_extract'

我做错了什么?

编辑:

run.py

from intel import create_app

app = create_app()
app.run(debug=True)

【问题讨论】:

  • 你有 sam_monthly_extract 表吗?
  • 你的run.py是什么?发布该代码
  • 是的,桌子在那里。
  • 请确保您只在致电db.Model.metadata.reflect() 后使用import sam。您的导入语句不必位于文件的顶部。
  • 我在 sam_blueprint 中使用我的 Sam 模型,该模型位于 intel\views

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

我在寻找相同问题的答案时遇到了您的问题,因为它帮助我真正做到了,所以我必须确保回来为您提供帮助解决我的问题的方法。

认为正在发生的事情是,包含应用程序工厂的 __init__.py 是从我的 run.py 导入的,而位于底部的 models.py 的导入也是如此。 __init__ 文件,在我可以运行该函数以创建应用程序之前导入该文件,并且没有任何上下文可以从中提取该表。这至少是我目前能解释的最好的了。

为我解决的问题是将模型导入移动到应用程序工厂,显式地在应用程序上下文下,就在 db.init_app() 之后,如下所示:

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)

    db.init_app(app)

    with app.app_context():
        db.Model.metadata.reflect(db.engine)
        from app import models

不确定这是否是最好的方法,但从那以后它一直对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 2018-03-26
    • 1970-01-01
    • 2014-10-26
    • 2017-07-07
    • 2018-06-13
    • 1970-01-01
    • 2020-06-12
    相关资源
    最近更新 更多