我正在构建一个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文件,但事实并非如此。相反,他们分别在子文件夹或父文件夹中看到它们。
答案 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-路径。 在这种情况下,它对我有用。