Flask-Migrate/Alembic在运行数据库迁移时出现`ValueError: not enough values to unpack (expected 2, got 1)`错误。

3
我创建了一个Flask应用程序,目前有大约30个模型。到目前为止,在本地测试一切正常,我有一个本地的Postgresql docker容器,我会使用SQLAlchemy().create_all()来创建所有表。这一直很好地运作。然而,我发现为了使这个应用程序更具生产力,我应该开始使用迁移而不是每次进行模式更改时运行create_all()。因此,我按照Flask-migrate文档实施了迁移命令,成功运行了python manage.py db init,但当我运行python manage.py db migrate时,我得到了一个相当长的堆栈跟踪,最后以ValueError: not enough values to unpack (expected 2, got 1)结束。我在之前的问题中找到了这个与我的错误匹配的问题,并尝试按照解决方法操作(我只有一个带有指定两个检查约束的__table_args__的表,如下所示):
    __table_args__ = (
        db.CheckConstraint('minutes >= 0', name='check_minutes_positive'),
        db.CheckConstraint('seconds between 0 and 59', name='check_seconds_valid')
    )

但即使我把它注释掉,我仍然得到了同样的错误。 我甚至注释掉了每个模型中的每个字段,除了主键,但仍然得到了相同的错误。
我已经尝试将alembic.ini文件中每个日志记录器的日志级别增加到DEBUG,但这并没有帮助我找出这个错误的根本原因。堆栈跟踪中的最后一个调用指向api/.venv/lib/python3.8/site-packages/alembic/autogenerate/render.py的第808行的_fk_colspec,但由于我无法弄清楚导致ValueError的问题端缺失了什么,所以这并没有告诉我太多有用的信息。希望能得到任何有关如何查找问题的帮助。
以下是迁移命令的完整输出(我只删除了大部分显示表名和创建索引的初始INFO行,因为我认为它们并不相关。只留了第一个和最后一个):
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added table 'tAbstractQuestions'
INFO  [alembic.autogenerate.compare] Detected added index 'ix_tAbstractQuestions_questionTypeId' on '['questionTypeId']'
INFO  [alembic.autogenerate.compare] Detected added table 'tQuestionsOptions'
INFO  [alembic.autogenerate.compare] Detected added index 'ix_tQuestionsOptions_questionId' on '['questionId']'
INFO  [alembic.autogenerate.compare] Detected added index 'ix_tQuestionsOptions_questionOptionId' on '['questionOptionId']'
Traceback (most recent call last):
  File "manage.py", line 70, in <module>
    manager.run()
  File "/api/.venv/lib/python3.8/site-packages/flask_script/__init__.py", line 417, in run
    result = self.handle(argv[0], argv[1:])
  File "/api/.venv/lib/python3.8/site-packages/flask_script/__init__.py", line 386, in handle
    res = handle(*args, **config)
  File "/api/.venv/lib/python3.8/site-packages/flask_script/commands.py", line 216, in __call__
    return self.run(*args, **kwargs)
  File "/api/.venv/lib/python3.8/site-packages/flask_migrate/__init__.py", line 96, in wrapped
    f(*args, **kwargs)
  File "/api/.venv/lib/python3.8/site-packages/flask_migrate/__init__.py", line 210, in migrate
    command.revision(config, message, autogenerate=True, sql=sql,
  File "/api/.venv/lib/python3.8/site-packages/alembic/command.py", line 221, in revision
    scripts = [script for script in revision_context.generate_scripts()]
  File "/api/.venv/lib/python3.8/site-packages/alembic/command.py", line 221, in <listcomp>
    scripts = [script for script in revision_context.generate_scripts()]
  File "/api/.venv/lib/python3.8/site-packages/alembic/autogenerate/api.py", line 513, in generate_scripts
    yield self._to_script(generated_revision)
  File "/api/.venv/lib/python3.8/site-packages/alembic/autogenerate/api.py", line 425, in _to_script
    render._render_python_into_templatevars(
  File "/api/.venv/lib/python3.8/site-packages/alembic/autogenerate/render.py", line 49, in _render_python_into_templatevars
    _render_cmd_body(upgrade_ops, autogen_context)
  File "/api/.venv/lib/python3.8/site-packages/alembic/autogenerate/render.py", line 71, in _render_cmd_body
    lines = render_op(autogen_context, op)
  File "/api/.venv/lib/python3.8/site-packages/alembic/autogenerate/render.py", line 87, in render_op
    lines = util.to_list(renderer(autogen_context, op))
  File "/api/.venv/lib/python3.8/site-packages/alembic/autogenerate/render.py", line 179, in _add_table
    for rcons in [
  File "/api/.venv/lib/python3.8/site-packages/alembic/autogenerate/render.py", line 180, in <listcomp>
    _render_constraint(cons, autogen_context)
  File "/api/.venv/lib/python3.8/site-packages/alembic/autogenerate/render.py", line 775, in _render_constraint
    return renderer(constraint, autogen_context)
  File "/api/.venv/lib/python3.8/site-packages/alembic/autogenerate/render.py", line 871, in _render_foreign_key
    "refcols": ", ".join(
  File "/api/.venv/lib/python3.8/site-packages/alembic/autogenerate/render.py", line 872, in <genexpr>
    repr(_fk_colspec(f, apply_metadata_schema))
  File "/api/.venv/lib/python3.8/site-packages/alembic/autogenerate/render.py", line 808, in _fk_colspec
    tname, colname = tokens[-2:]
ValueError: not enough values to unpack (expected 2, got 1)

谢谢!

1个回答

3

我在Alembic的GitHub仓库上发布了同样的问题,并在那里找到了正确的方向。问题链接

以下是解决方案:

找到了!我决定深入研究。所以我注释掉了每个有外键的表,并运行迁移-成功了。 然后我从那些确实有外键的表中逐个添加表,终于发现其中一个表有一个db.foreignKey('tableName')(没有指定应该应用约束的实际列)。 所以没有错误,但我想更详细的错误信息会节省我很多时间,哈哈。为了验证-在修复错误配置后,我清理了迁移文件夹并重新启动了我的PostgreSQL容器(它从头开始启动了一个全新的数据库), 并运行migrate命令来创建一个包含所有模型的单个修订版本- 它工作了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接