【问题标题】:How to directly access SQLite database to delete alembic_version table?如何直接访问 SQLite 数据库删除 alembic_version 表?
【发布时间】:2019-12-01 19:56:09
【问题描述】:

我正在构建一个 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中的条目,然后我将重新初始化迁移文件夹并迁移:

$ 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://')

我不精通引擎配置,在这一点上我被卡住了。我不知道是否需要在上下文处理器之外执行此操作?也许它没有提取引擎信息?也许我需要绑定引擎?

尝试 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 产生了同样的问题,我是否需要在上下文处理器之外执行此操作?我需要做更多的引擎配置吗?

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

【问题讨论】:

    标签: python sqlite flask sqlalchemy alembic


    【解决方案1】:

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

    【讨论】:

    • 哇,这是一个了不起的资源!它运行良好:我下载了 DB Browser,打开了数据库,然后删除了“alembic_version”表。新的初始化和迁移工作!谢谢!
    • 哇。不敢相信这个资源一直在这里。永远不会再与手动 SQLite 命令混淆。为项目捐款!感谢您传递此信息。
    【解决方案2】:

    我遇到了同样的问题。删除迁移文件夹是不够的。事实证明,我无法从我的 sublime 编辑器侧栏中看到我的 app.db 文件。检查您的文件系统并删除必要的文件,然后重新初始化您的数据库。

    【讨论】:

      【解决方案3】:

      以下是我从我的 sqlite 数据库中删除 alembic 表的步骤。我这样做是因为我收到了错误 (ERROR [root] Error: Can't locate revision identify by '6e09161ceced') 。执行以下步骤后,我运行命令(python manage.py db migrate --message "msg commit")没有问题。

      >>> from sqlalchemy import *
      >>> from sqlalchemy.ext.declarative import declarative_base
      >>> import os
      >>> from app.fifdb.config import basedir
      >>> url = 'sqlite:///' + os.path.join(basedir, 'flask_boilerplate_main.db')
      >>> engine = create_engine(url)
      >>> engine.table_names()
      ['alembic_version']
      >>> metadata = MetaData(engine, reflect=True)                                                                         
      >>> table = metadata.tables.get('alembic_version')
      >>> base = declarative_base()
      >>> base.metadata.drop_all(engine, [table], checkfirst=True)
      >>> engine.has_table('alembic_version')
      False
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        相关资源
        最近更新 更多