【问题标题】:How to setup Flask-Migrate with the correct database reference?如何使用正确的数据库参考设置 Flask-Migrate?
【发布时间】:2019-08-05 06:49:34
【问题描述】:

我正在构建一个烧瓶应用程序并尝试使用 Flask-Migrate 设置数据库迁移。我已经让它工作起来了,但是有一个奇怪的问题是 app/migrate 没有在同一个地方查找 .db 文件,需要知道如何让它们在同一个地方查找。

我的应用程序运行良好,没有出现任何错误。 Flask-Migrate 完美运行,我没有收到错误。这是我当前应用的简化布局:

app.py
app/
|- __init__.py
|- config.py

当我运行“烧瓶运行”时,它认为数据库在这里:

app.py
app/
|- __init__.py
|- config.py
|- app.db  <--(In the app folder)

但是当我运行“flask db upgrade”时,它认为数据库在这里:

app.py
app.db  <--(In the main folder)
app/
|- __init__.py
|- config.py

我将 SQLALCHEMY_DATABASE_URI 设置为“sqlite:///app.db”,如果我不断更改“sqlite:///app.db”和“sqlite”之间的 SQLALCHEMY_DATABASE_URI,我实际上可以让它们都正常工作: ///../app.db' 在运行这两个命令之间。

app.py 文件

from app import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

简体__init__.py file:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from app.config import Config
from flask_migrate import Migrate

db = SQLAlchemy()
migrate = Migrate()

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

    db.init_app(app)
    migrate.init_app(app, db)

    from app.routes import main
    app.register_blueprint(main)

    return app

简化的 config.py 文件

import os

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY')
    SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URI')

我希望 flask run 和 flask db upgrade 在同一个地方看到 .db 文件,但他们没有。相反,他们会分别在子文件夹或父文件夹中看到它们。

【问题讨论】:

    标签: python flask flask-migrate


    【解决方案1】:

    问题在于您使用的是 SQLite 数据库的 URL,因此每当应用程序更改当前工作目录时,您的数据库的位置将再次相对于新的当前目录进行计算。

    解决方法很简单,使用绝对 URL。这是在您设置 SQLALCHEMY_DATABASE_URI 环境变量时完成的,其值应该是这样的:

    export SQLALCHEMY_DATABASE_URI="sqlite:////home/yourname/yourapp/app.db"
    

    请注意,这是sqlite: 后跟四个斜杠,而不是三个。前两个斜杠是 URL 方案和 URL 其余部分之间的分隔符。第三个斜杠将主机/端口与路径分开(主机和端口在 SQLite URL 上为空)。第 4 个斜线是数据库文件绝对路径的开始。

    【讨论】:

    • 谢谢!那工作得很好。我已经看到可以使用绝对 URL,但我已经将它设置为使用相对 URL。绝对解决了这个问题,现在 Flask-Migrate 就像一个魅力。
    【解决方案2】:

    我不喜欢绝对 URI。

    在 env.py 中:

    config.set_main_option( 'sqlalchemy.url', current_app.config.get( 'SQLALCHEMY_DATABASE_URI').replace('%', '%%'))

    (您必须注释这些行才能使其正常工作)

    基本上使用您在 SQLALCHEMY_DATABASE_URI 中使用的内容。

    在我的情况下,“sqlite:///db.sqlite”会导致上述问题,原因如上所述(相对路径问题)

    为避免您描述的问题,请为 env.py 使用不同的(相对)uri

    (在 alembic.ini 文件的 [alembic] 部分下):

    [蒸馏器]

    sqlalchemy.url = sqlite:///app/db.sqlite

    所以现在,您将拥有满足所有不同需求的正确 -relative- 路径。 在这种情况下,它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2014-12-08
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多