在我的项目(一个由SQLAlchemy创建和管理的Postgres数据库)中,我使用MappedAsDataclass和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模型中创建这个列,特别是在使用MappedAsDataclass和DeclarativeBase声明表时?
在我阅读文档的过程中,我遇到了@hybrid_property
和column_property
,但是到目前为止,我试图让它们与我的Map数据类模式一起工作的尝试都失败了。
我一直在尝试这样的东西(这显然没有工作)
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上下文之外移植。
1条答案
按热度按时间qyswt5oh1#
你差点就成功了,你可以用这个。
字符串
这将生成以下内容
型
产出
第一个月
REGEXP_REPLACE(collection_name, ' ', '_', 'g')
?*