使用Flask-Migrate创建sqlite数据库

时间:2018-04-05 15:36:02

标签: python sqlite flask sqlalchemy flask-migrate

我正在使用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

然后它有效。

我仍然感觉我没有以正确的方式做到这一点。

1 个答案:

答案 0 :(得分:0)

TL; DR

是的,程序是正确的。对于sqlite数据库,这应该可行。

羞辱我。错误来自我刚刚在应用程序代码中介绍的检查,如果没有数据库,则在初始化时停止。我想知道我是如何错过的。

由于flask db upgrade启动了应用程序,我们在创建BD之前会经过此检查,我没想到...

支票使用

sqlalchemy_utils.functions.database_exists(base_uri)

如果文件存在,则在sqlite DB的情况下将返回True,即使它是空的,这也解释了touch文件的需要。

我取消了支票。如果管理员没有启动flask db upgrade并且应用程序在没有数据库的情况下启动,则在第一次向数据库发出请求之前,将没有反馈。这并不理想,但这是一个次要且无关的问题。