使用 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 并且应用程序在没有数据库的情况下启动,则在第一次请求数据库之前不会有任何反馈。这并不理想,但这是一个无关紧要的小问题。