我正在构建一个Flask web应用程序,在某个时候意外地删除了SQLite数据库的迁移文件。我在Flask中使用SQLAlchemy作为数据库命令,flaskalembic用于迁移。我试图删除“alembic_version”文件,该文件包含对丢失的迁移文件的引用,但无法执行此操作。在
我不久前删除了迁移文件,但直到最近尝试对我的数据库运行迁移时才注意到:
$ flask db migrate
我收到了以下错误消息:
^{pr2}$好的,我相信这意味着我删除了迁移文件,除了包含当前迁移版本的alembic_version表认为它仍然存在并试图引用它。我的想法是删除alembic_版本中的条目,然后重新初始化migrations文件夹并使用以下内容进行迁移:
$ flask db init
$ flask db migrate
所以我需要直接访问我的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://')
我对发动机配置不是很精通,在这一点上我卡住了。我不知道是否需要在上下文处理器之外执行此操作?也许它没有把引擎信息拉进来?也许我需要把引擎绑起来?在
在查看了有关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次尝试中,我是否需要在上下文处理器之外执行此操作?我需要做更多的引擎配置吗?在
任何帮助或指导都将不胜感激。在
要直接打开sqlite数据库,可以使用sqlitebrowserhttps://sqlitebrowser.org/
我也有同样的问题。删除迁移文件夹还不够。结果我看不到我的应用数据库从我的崇高编辑侧栏文件。检查文件系统并删除必要的文件,然后重新初始化数据库。在
相关问题 更多 >
编程相关推荐