我正在使用SQLAlchemy处理Flask应用程序,以连接sqlite数据库和Flask-Migrate来管理迁移。
我使用
生成了第一个迁移脚本flask db init
flask db migrate
我将回购推送到另一台服务器,我正在尝试使用
创建数据库flask db upgrade
这是正确的程序吗?
我很确定第一次这样做,sqlite数据库已经创建。
我试图在另一台服务器上再次执行此操作,然后我
SqlDatabaseDoesNotExistError: Database "sqlite:////absolute/path/to/sqlite.db" does not exist
如果删除并尝试在第一台服务器上重新创建数据库,我也会收到相同的错误。
目录存在且可写,但数据库文件不存在。
如果sqlite数据库不存在,那么sqlalchemy是否应该创建它?
我应该如何创建数据库? Flask-Migrate文档没有明确说明这一点,因为这是一个特定于sqlite的问题(我想其他数据库引擎不会自动创建数据库)。
我首先使用touch
创建空DB文件,然后设法让它工作。也许这就是我前几天所做的,我无法记住。
看起来是权限问题,但我没有得到它。
权限是:
drwxrwx--- 2 root www-data 4096 Apr 5 18:50 sqlite
我正在运行
flask db upgrade
无论如何,作为root,所以我不明白为什么它不起作用。
这就是我的所作所为:
touch sqlite/sqlite.db
chown www-data:www-data sqlite/sqlite.db
chmod 600 sqlite/sqlite.db
flask db upgrade
然后它有效。
我仍然感觉我没有以正确的方式做到这一点。
答案 0 :(得分:0)
TL; DR
是的,程序是正确的。对于sqlite数据库,这应该可行。
羞辱我。错误来自我刚刚在应用程序代码中介绍的检查,如果没有数据库,则在初始化时停止。我想知道我是如何错过的。
由于flask db upgrade
启动了应用程序,我们在创建BD之前会经过此检查,我没想到...
支票使用
sqlalchemy_utils.functions.database_exists(base_uri)
如果文件存在,则在sqlite DB的情况下将返回True
,即使它是空的,这也解释了touch
文件的需要。
我取消了支票。如果管理员没有启动flask db upgrade
并且应用程序在没有数据库的情况下启动,则在第一次向数据库发出请求之前,将没有反馈。这并不理想,但这是一个次要且无关的问题。