如何直接访问SQLite数据库删除alembic_versiontable?
How to directly access SQLite database to delete alembic_version table?
我正在构建一个 Flask 网络应用程序,有时不小心删除了我的 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 table 认为 它仍然存在并试图引用它。我的想法是删除alembic_version中的条目,然后我将重新初始化migrations文件夹并迁移:
$ flask db init
$ flask db migrate
尝试 1
所以我需要直接访问我的 SQLite 数据库,并删除 table。首先,我尝试使用此代码删除所有 tables:
#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 引擎连接的信息后,发现 here and here,我尝试使用我的烧瓶 shell 上下文处理器直接删除 table:
@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()
但它没有用,因为我可以在数据库中查询另一个 table,它 returns 是一个完整的 table。不过为了确定,我再次尝试迁移:
$ 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'
所以实际上并没有 table 被丢弃。尝试 1 也出现了同样的问题,我是否需要在上下文处理器之外执行此操作?我需要做更多的引擎配置吗?
非常感谢任何帮助或指导。
直接打开sqlite数据库,可以使用sqlitebrowser https://sqlitebrowser.org/
我遇到了同样的问题。删除迁移文件夹是不够的。事实证明,我无法从我的 sublime 编辑器边栏中看到我的 app.db 文件。检查您的文件系统并删除必要的文件,然后重新初始化您的数据库。
以下是我从我的 sqlite 数据库中删除 alembic table 所采取的步骤。我这样做是因为我收到错误 (ERROR [root] Error: Can't locate revision identified 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
我正在构建一个 Flask 网络应用程序,有时不小心删除了我的 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 table 认为 它仍然存在并试图引用它。我的想法是删除alembic_version中的条目,然后我将重新初始化migrations文件夹并迁移:
$ flask db init
$ flask db migrate
尝试 1
所以我需要直接访问我的 SQLite 数据库,并删除 table。首先,我尝试使用此代码删除所有 tables:
#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 引擎连接的信息后,发现 here and here,我尝试使用我的烧瓶 shell 上下文处理器直接删除 table:
@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()
但它没有用,因为我可以在数据库中查询另一个 table,它 returns 是一个完整的 table。不过为了确定,我再次尝试迁移:
$ 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'
所以实际上并没有 table 被丢弃。尝试 1 也出现了同样的问题,我是否需要在上下文处理器之外执行此操作?我需要做更多的引擎配置吗?
非常感谢任何帮助或指导。
直接打开sqlite数据库,可以使用sqlitebrowser https://sqlitebrowser.org/
我遇到了同样的问题。删除迁移文件夹是不够的。事实证明,我无法从我的 sublime 编辑器边栏中看到我的 app.db 文件。检查您的文件系统并删除必要的文件,然后重新初始化您的数据库。
以下是我从我的 sqlite 数据库中删除 alembic table 所采取的步骤。我这样做是因为我收到错误 (ERROR [root] Error: Can't locate revision identified 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