在我的项目(由SQLAlChemy创建和管理的Postgres数据库)中,我使用MappdAsDataclass和DeclarativeBase创建如下表:
class Base(MappedAsDataclass, DeclarativeBase):
"""subclasses will be converted to dataclasses"""
class Collection(Base):
__tablename__ = 'collections'
collection_id: Mapped[int] = mapped_column(init=False, primary_key=True)
collection_name: Mapped[str] = mapped_column(default=None, unique = True)
User.__table__
Collection.metadata.create_all(engine)
我想用一个计算列‘ezname’创建这个表,该列从‘Collection_name’中的条目中删除空格,并用‘_’下划线替换它们.
我可以通过创建上面的表,然后运行原始的postgres命令来获得我想要的:
ALTER TABLE collections ADD column ezname varchar GENERATED ALWAYS AS (REGEXP_REPLACE(collection_name, ' ', '_')) stored;
有没有办法在ORM模型中创建此列,特别是在使用MappdAsDataclass和DeclarativeBase声明表时?
在我阅读文档的过程中,我遇到了@hybrid_property
和column_property
,然而,到目前为止,我试图让它们使用我映射的数据类模式的try 都失败了.
我一直在try 这样的东西(显然不起作用)
class Collection(Base):
__tablename__ = 'collections'
collection_id: Mapped[int] = mapped_column(init=False, primary_key=True)
collection_name: Mapped[str] = mapped_column(default=None, unique = True)
collection_ezname: Mapped[str] = mapped_column(default=None, unique = True, Computed(REGEXP_REPLACE(collection_name, ' ', '_')))
因此,首先我想知道SQLA是否可以做到这一点,如果可以,如何做到这一点?
请注意,对于我来说,重要的是逻辑在创建后成为表本身的一部分,因此可以移植到ORM上下文之外.