使用 Flask-Migrate 创建 sqlite 数据库
Create sqlite database using Flask-Migrate
我正在开发一个 Flask 应用程序,使用 SQLAlchemy 连接 sqlite 数据库并使用 Flask-Migrate 管理迁移。
我使用
生成了第一个迁移脚本
flask db init
flask db migrate
我将 repo 推送到另一台服务器,我正在尝试使用
创建数据库
flask db upgrade
这是正确的程序吗?
我很确定我第一次这样做时,就创建了 sqlite 数据库。
我试图在另一台服务器上再次执行此操作,我得到了
SqlDatabaseDoesNotExistError: Database "sqlite:////absolute/path/to/sqlite.db" does not exist
如果删除并尝试在第一台服务器上重新创建数据库,我也会遇到同样的错误。
目录存在且可写,但数据库文件不存在
sqlalchemy 不应该创建 sqlite 数据库吗?
我该如何创建数据库? Flask-Migrate 文档对此没有明确说明,因为这是一个特定于 sqlite 的问题(我猜其他数据库引擎不会自动创建数据库)。
我设法通过首先使用 touch
创建空数据库文件来让它工作。可能是我前几天做的吧,记不太清了。
看起来像是权限问题,只是我不明白。
权限为:
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
然后就可以了。
我仍然觉得我的做法不对。
TL;博士
是的,程序是正确的。对于 sqlite 数据库,这应该有效。
真丢人。该错误来自我刚才在应用程序代码中引入的检查,如果没有数据库,则在初始化时停止。我想知道我是怎么错过的。
自从 flask db upgrade
启动应用程序以来,我们在创建 BD 之前进行了此检查,这是我没有预料到的...
支票使用
sqlalchemy_utils.functions.database_exists(base_uri)
在 sqlite 数据库的情况下,如果文件存在,即使它是空的,也会 return True
,这说明需要 touch
文件。
我取消了支票。如果管理员没有启动 flask db upgrade
并且应用程序在没有数据库的情况下启动,则在第一次请求数据库之前不会有任何反馈。这并不理想,但这是一个无关紧要的小问题。
我正在开发一个 Flask 应用程序,使用 SQLAlchemy 连接 sqlite 数据库并使用 Flask-Migrate 管理迁移。
我使用
生成了第一个迁移脚本flask db init
flask db migrate
我将 repo 推送到另一台服务器,我正在尝试使用
创建数据库flask db upgrade
这是正确的程序吗?
我很确定我第一次这样做时,就创建了 sqlite 数据库。
我试图在另一台服务器上再次执行此操作,我得到了
SqlDatabaseDoesNotExistError: Database "sqlite:////absolute/path/to/sqlite.db" does not exist
如果删除并尝试在第一台服务器上重新创建数据库,我也会遇到同样的错误。
目录存在且可写,但数据库文件不存在
sqlalchemy 不应该创建 sqlite 数据库吗?
我该如何创建数据库? Flask-Migrate 文档对此没有明确说明,因为这是一个特定于 sqlite 的问题(我猜其他数据库引擎不会自动创建数据库)。
我设法通过首先使用 touch
创建空数据库文件来让它工作。可能是我前几天做的吧,记不太清了。
看起来像是权限问题,只是我不明白。
权限为:
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
然后就可以了。
我仍然觉得我的做法不对。
TL;博士
是的,程序是正确的。对于 sqlite 数据库,这应该有效。
真丢人。该错误来自我刚才在应用程序代码中引入的检查,如果没有数据库,则在初始化时停止。我想知道我是怎么错过的。
自从 flask db upgrade
启动应用程序以来,我们在创建 BD 之前进行了此检查,这是我没有预料到的...
支票使用
sqlalchemy_utils.functions.database_exists(base_uri)
在 sqlite 数据库的情况下,如果文件存在,即使它是空的,也会 return True
,这说明需要 touch
文件。
我取消了支票。如果管理员没有启动 flask db upgrade
并且应用程序在没有数据库的情况下启动,则在第一次请求数据库之前不会有任何反馈。这并不理想,但这是一个无关紧要的小问题。