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

时间:2019-07-23 17:55:11

标签: 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'

好的,所以我认为这意味着我删除了迁移文件,但包含当前迁移版本 thinks 的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://')

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

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

非常感谢您的帮助或指导。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

以下是我从sqlite数据库删除alembic表的步骤。我这样做是因为我遇到了错误(错误[root]错误:找不到由'6e09161ceced'标识的修订版)。完成以下步骤后,我运行了命令(python manage.py db migration --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