在 SQLAlchemy 中使用序列生成字符串主键

Generating string primary keys with sequence in SQLAlchemy

在 SQA 中生成随机字符串键相对简单,类似于:

request_id = Column(String, default=lambda: uuid.uuid4().hex, primary_key=True)

但是,我需要让 request_id 具有类似 DIVISION_ABC_REQUEST_223 的格式(这是因为 PK 也应该对人类消费有益——该密钥将通过电子邮件发送, copied/pasted,等等,但它也应该可用于常规 SQA/SQL 查询作为典型的 PK),整数后缀最好遵循正常(顺序)序列。

(后端数据库为Postgres)

我找到了解决办法,如果有点浪费:

class WorkPackage(Base):
    __tablename__ = 'work_package'
    int_id = Column(Integer, primary_key=True)
    wp_prefix = Column(Unicode, default=u'DIVISION_ABC_REQUEST_', primary_key=True)
    data = Column(Unicode)

    @hybrid_property
    def wp_id(self):
        return self.wp_prefix + str(self.int_id)

    @wp_id.expression
    def wp_id(cls):
        return cls.wp_prefix.concat(cls.int_id)

wp_id.expression 使用 concat(产生 SQL 连接运算符 ||ColumnOperator)。

它在按所需顺序自动创建 PK 以及通过 wp_id 属性进行查询的意义上起作用。

然而,愚蠢的方面是显然有一个列一遍又一遍地填充相同的前缀。