在SQLAlchemy中生成带序列的字符串主键

时间:2016-01-12 16:21:25

标签: python postgresql sqlalchemy primary-key sequence

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

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

但是,我需要让request_id具有类似DIVISION_ABC_REQUEST_223的格式(这是因为PK也应该对人类消费有益 - 该密钥将在电子邮件中发送,复制/粘贴等,但它也应该可用于常规SQA / SQL查询作为典型的PK),理想情况下整数后缀遵循正常(序数)序列。

(后端数据库是Postgres)

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,如果有点浪费:

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的{​​{1}})。

它的工作方式是按所需顺序自动创建PK,并通过||属性进行查询。

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