python - 如何直接访问SQLite数据库删除alembic_version表?

标签 python sqlite flask sqlalchemy alembic

我正在构建一个 Flask Web 应用程序,并且在某个时候不小心删除了我的 SQLite 数据库的迁移文件。我在 Flask 中使用 SQLAlchemy 来执行数据库命令,并使用 Flask-alembic 来执行迁移。我正在尝试删除包含对丢失迁移文件的引用的“alembic_version”文件,但这样做时遇到问题。

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

$ flask db migrate

我收到以下错误消息:

INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
ERROR [root] Error: Can't locate revision identified by '44ab999461f7'

好的,所以我相信这意味着我删除了迁移文件,但包含当前迁移版本的 alembic_version 表认为它仍然存在并尝试引用它。我的想法是删除alembic_version中的条目,然后我将重新初始化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.

好的,所以引擎配置有问题,或者其他什么问题。我的引擎创建位于 __init__.py 文件中,并使用内存:

engine = create_engine('sqlite://')

我不太熟悉引擎配置,此时我陷入了困境。我不知道是否需要在上下文处理器之外执行此操作?也许它没有提取引擎信息?也许我需要绑定(bind)引擎?

尝试 2

查找SQLAlchemy引擎连接信息后,发现herehere ,我尝试使用我的 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

导致与上面相同的错误:

INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
ERROR [root] Error: Can't locate revision identified by '44ab999461f7'

所以实际上并没有删除表。尝试 1 也出现了同样的问题,我是否需要在上下文处理器之外执行此操作?我需要做更多的引擎配置吗?

非常感谢任何帮助或指导。

最佳答案

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

关于python - 如何直接访问SQLite数据库删除alembic_version表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57169757/

相关文章:

python - macOS Big Sur 上没有名为 pip 的模块

android - 在 Android 中将表名作为字符串传递给 SQLiteDatabase 删除函数

python - NOT NULL 约束在 Flask + SQLite3 中失败

python - Flask-WTForms 在我的项目目录中找不到 WTForms

mysql - UserMixin 破坏 mySQL 连接器

python - 将 numpy 数据插入到更大的零数组中

Python3.2 无法识别解释器中的 UP/DOWN/LEFT/RIGHT 键?

python - 列表分配给其他列表

python - SQLite3 Python : How to do an efficient bulk update?

android - 类似模式的 SQL 接口(interface)?