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

时间:2019-08-05 06:49:34

标签: python flask flask-migrate

我正在构建一个Flask应用程序,并试图使用Flask-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”和“ 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运行和flask db升级可以在同一位置看到.db文件,但事实并非如此。相反,他们分别在子文件夹或父文件夹中看到它们。

2 个答案:

答案 0 :(得分:1)

问题是您正在使用SQLite数据库的URL,因此,只要应用程序更改了当前工作目录,就会相对于新的当前目录再次计算数据库的位置。

解决方案很简单,使用绝对URL。当您设置SQLALCHEMY_DATABASE_URI环境变量时,此操作就完成了,该值应该是这样的:

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

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

答案 1 :(得分:0)

我不喜欢绝对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

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