在 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
属性进行查询的意义上起作用。
然而,愚蠢的方面是显然有一个列一遍又一遍地填充相同的前缀。
在 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
属性进行查询的意义上起作用。
然而,愚蠢的方面是显然有一个列一遍又一遍地填充相同的前缀。