如何直接访问SQLite数据库删除alembic_版本表?

2021-01-28 08:06:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个Flask web应用程序,在某个时候意外地删除了SQLite数据库的迁移文件。我在Flask中使用SQLAlchemy作为数据库命令,flaskalembic用于迁移。我试图删除“alembic_version”文件,该文件包含对丢失的迁移文件的引用,但无法执行此操作。在

我不久前删除了迁移文件,但直到最近尝试对我的数据库运行迁移时才注意到:

$ flask db migrate

我收到了以下错误消息:

^{pr2}$

好的,我相信这意味着我删除了迁移文件,除了包含当前迁移版本的alembic_version表认为它仍然存在并试图引用它。我的想法是删除alembic_版本中的条目,然后重新初始化migrations文件夹并使用以下内容进行迁移:

$ flask db init
$ flask db migrate

尝试1

所以我需要直接访问我的SQLite数据库,并删除表。首先,我尝试使用以下代码删除所有表:

#drop alembic_version table
if db.engine.dialect.has_table(db.engine, 'alembic_version'):
    version = db.Table('alembic_version', db.metadata,autoload_with=db.engine)
    version.drop()

thread中找到。在

运行此函数时,我得到错误:

sqlalchemy.exc.UnboundExecutionError: Table object 'alembic_version' is not bound to an Engine or Connection.  Execution can not proceed without a database to execute against.

好吧,引擎配置有问题,或者其他什么。我的引擎创建在我的\uuu init_uy.py文件中,并使用内存:

engine = create_engine('sqlite://')

我对发动机配置不是很精通,在这一点上我卡住了。我不知道是否需要在上下文处理器之外执行此操作?也许它没有把引擎信息拉进来?也许我需要把引擎绑起来?在

尝试2

在查看了有关SQLAlchemy引擎连接的信息后,找到了here和{a3},我尝试使用我的flask shell上下文处理器直接删除表:

@app.shell_context_processor
def make_shell_context():
        return {'db':db,'User':User}
from sqlalchemy import create_engine
engine=create_engine('sqlite://')
engine
Engine(sqlite://)
engine.execute('DROP TABLE IF EXISTS alembic_version')
<sqlalchemy.engine.result.ResultProxy object at 0x0000028EFEA9A588>
exit()

但是它没有工作,因为我可以查询数据库中的另一个表,它返回一个完整的表。不过为了确定一下,我又试着迁移了:

$ flask db migrate

结果与上述相同:

^{pr2}$

所以不是桌子真的掉了。同样的问题也出现在第1次尝试中,我是否需要在上下文处理器之外执行此操作?我需要做更多的引擎配置吗?在

任何帮助或指导都将不胜感激。在

2条回答
网友
1楼 ·

要直接打开sqlite数据库,可以使用sqlitebrowserhttps://sqlitebrowser.org/

网友
2楼 ·

我也有同样的问题。删除迁移文件夹还不够。结果我看不到我的应用数据库从我的崇高编辑侧栏文件。检查文件系统并删除必要的文件,然后重新初始化数据库。在

相关问题