ABM*_*ABM 11 python sqlalchemy alembic
我正在使用sqlalchemy,我正在尝试将alembic集成到数据库迁移中.
我的数据库目前存在,并且定义了许多没有名称的ForeignKeys.我想添加一个命名约定,以允许影响ForeignKey列的迁移.
我已将此处给出的命名约定添加到models.py文件的顶部: SQLAlchemy Naming Constraints
convention = {
"ix": 'ix_%(column_0_label)s',
"uq": "uq_%(table_name)s_%(column_0_name)s",
"ck": "ck_%(table_name)s_%(constraint_name)s",
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
"pk": "pk_%(table_name)s"
}
DeclarativeBase = declarative_base()
DeclarativeBase.metadata = MetaData(naming_convention=convention)
def db_connect():
return create_engine(URL(**settings.DATABASE))
def create_reviews_table(engine):
DeclarativeBase.metadata.create_all(engine)
class Review(DeclarativeBase):
__tablename__ = 'reviews'
id = Column(Integer, primary_key=True)
review_id = Column('review_id', String, primary_key=True)
resto_id = Column('resto_id', Integer, ForeignKey('restaurants.id'),
nullable=True)
url = Column('url', String),
resto_name = Column('resto_name', String)
Run Code Online (Sandbox Code Playgroud)
我根据教程说明设置了alembic/env.py,将模型的元数据提供给target_metadata.
我跑的时候
$: alembic current
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:sqlalchemy.exc.InvalidRequestError:包含%(constraint_name)标记的命名约定要求明确命名约束.
在文档中,他们说"即使我们只使用Column.unique标志,这个相同的功能[使用命名约定生成列的名称]也会生效:" 1,所以我认为应该没有问题(他们继续使用一个未命名的ForeignKey给出一个例子.
我是否需要返回并为所有约束提供明确的名称,或者是否有办法自动执行此操作?
此错误消息告诉您应该明确命名约束。它所指的约束是布尔值、枚举等,但不是外键或主键。因此,请检查您的表,无论您在哪里有布尔值或枚举,都为其添加名称。例如:
is_active = Column(Boolean(name='is_active'))
Run Code Online (Sandbox Code Playgroud)
这就是你需要做的。
这并不是要成为明确的答案,也无法回答您眼前的技术问题,但这可能是一个“哲学问题”吗?就数据库而言,您的 SQLAlchemy 代码是事实来源,或者 RDMS 是来源。面对这种混合情况,两者各有其一部分,我会看到两种途径:
您正在探索的一种:修改数据库的架构以匹配 SQLAlchemy 模型,并使您的 Python 代码成为主代码。这是最直观的,但出于技术和管理原因,这可能并不总是可行。
接受 RDMS 拥有 SQLAlchemy 没有的信息,但幸运的是与日常工作无关。最好的机会是使用另一个迁移工具 (ETL),该工具将在迁移之前对数据库进行逆向工程。迁移完成后,您可以将新实例的控制权交还给 SQLAlchemy(这可能需要对新数据库或模型进行一些调整)。
无法判断哪种方法有效,因为两种方法都有各自的挑战。但我会考虑一下第二种方法?
| 归档时间: |
|
| 查看次数: |
2224 次 |
| 最近记录: |