- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
软件版本:alembic 1.0.5、SQLAlchemy 1.2.14、MySQL 5.7、Python 3.6.7
我正在尝试使用 alembic 来保持 MySQL 数据库模式和 Python ORM 表示同步。
我看到的问题是迁移总是有多余的删除和创建外键命令。似乎 autogenerate 看到的是不同的东西,但实际上它们是相同的。
关于命令的重复调用:
alembic revision --autogenerate
alembic upgrade head
...将生成相同的放置和创建命令。
到 stdout 的日志记录显示类似(例如)的内容:
INFO [alembic.autogenerate.compare] Detected removed foreign key (t1_id)(id) on table table_two
INFO [alembic.autogenerate.compare] Detected added foreign key (t1_id)(id) on table test_fktdb.table_two
迁移脚本有:
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint('fk_table1', 'table_two', type_='foreignkey')
op.create_foreign_key('fk_table1', 'table_two', 'table_one', ['t1_id'], ['id'], source_schema='test_fktdb', referent_schema='test_fktdb')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint('fk_table1', 'table_two', schema='test_fktdb', type_='foreignkey')
op.create_foreign_key('fk_table1', 'table_two', 'table_one', ['t1_id'], ['id'])
# ### end Alembic commands ###
这个问题可以重现,我做了一个最小的例子(https://github.com/sqlalchemy/alembic/files/2625781/FK_test.tar.gz 上的 tar.gz)。示例中的 ORM 是这样的:
[...import and bobs...]
class TableOne(Base):
"""Class representing a table with an id."""
__tablename__ = "table_one"
id = Column(UNSIGNED_INTEGER, nullable=False, autoincrement=True, primary_key=True)
__table_args__ = (
dict(mysql_engine='InnoDB'),
)
class TableTwo(Base):
"""A table representing records with a foreign key link to table one."""
__tablename__ = "table_two"
id = Column(UNSIGNED_INTEGER, nullable=False, autoincrement=True, primary_key=True)
t1_id = Column(UNSIGNED_INTEGER, nullable=False)
__table_args__ = (
ForeignKeyConstraint(["t1_id"], ["test_fktdb.table_one.id"], name="fk_table1"),
dict(mysql_engine='InnoDB'),
)
是否可以采取任何措施使 alembic“看到”数据库中的 FK 与 ORM 中的相同?例如,通过 env.py
应用一些配置?
我查看了这个问题并在 alembic GitHub 中发现了一些旧问题(参见 [1]、[2]、[3])。有解决方案的问题似乎与 postgres 数据库和公开模式有关。我不确定这是否适用于这种情况,因为我使用的是 MySQL;公共(public) postgres 模式的相关文档在这里:https://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#remote-schema-table-introspection-and-postgresql-search-path
我现在已将我自己的问题添加到 alembic GitHub 存储库:https://github.com/sqlalchemy/alembic/issues/519
alembic 问题跟踪器中的已关闭问题,它们显示出类似的症状,但其解决方案不适用(据我所知):
[1] https://github.com/sqlalchemy/alembic/issues/444
最佳答案
所以,虽然这个 SO 问题很老,并且让我获得了 Tumbleweed 徽章,但我认为最好回答它并关闭它。我从 GitHub 上的软件包维护者 Mike Bayer 那里得到了很好的回答:
OK, so here is the thing. you are connecting with "test_fktdb" in your database URL as the default schema. which means, alembic is going to find your tables in that schema, and when it finds the foreign key, it will see the "schema_name" field in that FK as empty, because this is the default schema. So it doesn't match what you have in your metadata. Also you aren't adding "include_schemas=True" to the environment, so you will definitely not get reasonable results when your ORM models have "schema='test_fktdb'" in them.
there's two general worlds you can go into to fix this.
easy one. take out "schema" from your tables/metadata/foreign keys entirely. then everything works in test_fktdb as the default and everything matches.
hard one. you need to connect to a different database on your URL, then set up include_schemas=True in your envrionment, you probably also need a reasonable include_object() scheme so that it doesnt read in all the other databases, set up version_table_schema='test_fktdb', then that works too:
env.py:
SCHEMA_NAME = "NOT_test_fktdb"
def include_object(object, name, type_, reflected, compare_to):
if (type_ == "table"):
return object.schema == "test_fktdb"
else:
return True
with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=target_metadata,
compare_type=True,
compare_server_default=True,
include_schemas=True,
version_table_schema="test_schema",
include_object=include_object
)
# ...
the "schema" logic necessarily has to rely heavily on this concept of "default" schema being a blank string, so when you mix up the default schema also being present it confuses things.
GitHub 上还有更多内容 https://github.com/sqlalchemy/alembic/issues/519 .
我发现简单的选项很管用,我做了以下更改:
# instead of [...]:
# declarative_base(metadata=sqlalchemy.MetaData(schema=test_fktdb.SCHEMA_NAME))
Base = sqlalchemy.ext.declarative.declarative_base()
# instead of [...]:
# ForeignKeyConstraint(["t1_id"], ["test_fktdb.table_one.id"], name="fk_table1"),
ForeignKeyConstraint(["t1_id"], ["table_one.id"], name="fk_table1"),
关于python - `alembic revision --autogenerate` 产生冗余外键迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53523529/
举个例子:假设在 svn update 之后我使用的是修订版 10。如果我现在添加一个文件并执行提交,svnversion 将报告我处于混合修订版的状态;即10点11分。但由于这些数字是按顺序排列的,
链接: http://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-howto-rollback.html 描述了错误提交后回滚 SVN 目录的两种
在 Android 上制作 cat/proc/cpuinfo 返回这种输出: Processor : ARMv7 Processor rev 1 (v7l) processor
我在一个使用 alembic 管理数据库迁移的团队中工作。我最近拉了master,并尝试运行alembic upgrade heads .我收到以下消息; INFO [alembic.runtime
当我执行 git submodule update --init 时出现错误 fatal: Needed a single revision Unable to find current revisi
我有一个项目,我想在其中自动嵌入修订号。 在这种情况下,它是一个多文件 perl 脚本。在主文件中,我有一行如下所示: 我的 $revision = '$Revision: 24 $'; 当我发布时,
当使用以下代码时: {% with ""|add:revision.width|add:"x"|revision.height as dimensions %} {% thumbnail revi
我的幻灯片是这样说的: 递归调用应该总是在比当前调用更小的数据结构上 如果数据结构太小,必须有非递归的选项 您需要一个包装器方法来使递归方法可访问 仅从幻灯片中阅读此内容毫无意义,尤其是考虑到这是圣诞
归并排序的工作方式是: 获取值列表 一分为二 取每个列表的第一个元素,最小值进入一个新列表(我想从原来的列表中删除)。比较接下来的两个数字 - 这样做直到一个列表为空,然后将另一个列表的其余部分放在
我目前正在制作一个脚本,在其中我已经熟悉 Tortoise SVN 及其相应的命令行功能。 我正确更新了脚本,以通过一系列测试找到正确构建的“修订版”。在脚本记录该变量(特定于版本号的)之后,我更新到
我一直在使用 git subtree split 将一个巨大的存储库(从另一个 VCS 导入到 Git)划分为较小的存储库。 $ git subtree split -P ./path/to/fold
我想用c#读/写窗口信息文件(扩展文件属性) 通过执行以下操作找到的:在窗口资源管理器中右键单击 => 属性 => 摘要选项卡。我主要想访问属性: 职位 类别 修订号 对于办公文档,我可以使用以下(使
如何导出/获取属于修订版的所有文件? 例如: 在修订版 5434 上,如果我们提交了 5 个文件,如何获取指定修订版的所有 5 个文件? 类似 svn export有修订号,但我 只有想要我在该修订版
我们曾经有一个用于多个项目的共享SVN存储库,昨天,我们的SVN管理员创建了一个特定于我们项目的新SVN存储库。 我将项目的现有 checkout 位置重新定位到了新的SVN存储库,但是现在,当我进行
我的仓库有 3 次提交。我想挤成一个。 我运行 git rebase -i HEAD~3 并得到这个错误: fatal: Needed a single revision invalid upstre
我们将 svn:externals 用于库的特定修订,例如像 xyzlib -r12345 https://asdf.asdf.local/xyzlib/trunk/ 当您在工作副本中对此类 chec
我希望将韩文地名罗马化。函数 stringi::stri_trans_general 支持韩文罗马化,但显然不符合广泛应用和官方的 Revised Romanization of Korean 方案。
当人们在OCaml中引用“修订的语法”时,他们是说这将成为该语言的新语法,还是只是在CamlP4中创建的替代语法?如果是前者,那么“修订语法”何时会成为OCaml的“官方语法”? 最佳答案 修改后的语
我有一种情况: 开发人员正在从事 SVN 项目。 人检查 SVN 项目,走开, child /猫/妻子坐下/dools/sleepwalks/任何在计算机上并插入 gobbledygook asdfg
这里只是一个小的SVN“问题”。 我设置了自己的 SVN 服务器 Setting up Subversion on Windows 现在我做了一个代表,我所有的项目都将参与其中。 现在,我在名为“Pr
我是一名优秀的程序员,十分优秀!