如何使用正确的数据库引用设置 Flask-Migrate?

How to setup Flask-Migrate with the correct database reference?

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

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

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

当我 运行 'flask run' 它认为数据库在这里:

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' 和 [=39] 之间更改 SQLALCHEMY_DATABASE_URI,我实际上可以让它们都正常工作=] 在 运行 两个命令之间。

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 运行 和 flask db upgrade 在同一个地方看到 .db 文件,但他们没有。相反,他们会分别在子文件夹或父文件夹中看到它们。

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

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

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

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

我不喜欢绝对 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] 部分下):

[alembic]

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

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