如何使用正确的数据库引用设置 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
所以现在,您将拥有满足所有不同需求的正确的相对路径。
在这种情况下,它对我有用。
我正在构建一个 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
所以现在,您将拥有满足所有不同需求的正确的相对路径。 在这种情况下,它对我有用。