postgresql 如何在SQLAlchemy中创建字符串序列

ybzsozfc  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(113)

我目前正在开发发票的API。我想创建一个发票表与invoiceNumber字段,将自动递增,但作为一个字符串。大概是这样的:

  1. INV00001
  2. INV00002
  3. INV00003
    有没有可能使用SQLAlchemy以某种方式做到这一点?
    我尝试使用SQLAlchemy中的Sequence函数,但我知道它只针对整数设计。
44u64gxh

44u64gxh1#

使用Gordon Linoff中的SQL,我们可以定义一个列,默认值是一个整数序列和一个字符串前缀,如下所示:

  1. import sqlalchemy as sa
  2. engine = sa.create_engine('postgresql+psycopg2:///test', echo=True)
  3. tbl = sa.Table(
  4. 't77185472',
  5. sa.MetaData(),
  6. sa.Column(
  7. 'strseq',
  8. sa.String,
  9. server_default=sa.text(
  10. """('INV' || lpad(nextval('test_seq')::text, 6, '0'))"""
  11. ),
  12. ),
  13. )

列定义取决于序列test_seq的存在。我们可以选择添加一对侦听器,以便在删除或创建表时删除和创建此序列,从而使它们保持同步。

  1. @sa.event.listens_for(tbl, 'after_drop')
  2. def receive_after_drop(target, connection, **kw):
  3. """Drop the sequence if `tbl` is dropped."""
  4. connection.execute(sa.text("""DROP SEQUENCE IF EXISTS test_seq"""))
  5. @sa.event.listens_for(tbl, 'before_create')
  6. def receive_before_create(target, connection, **kw):
  7. """Create the sequence before `tbl` is created."""
  8. connection.execute(sa.text("""CREATE SEQUENCE test_seq"""))
展开查看全部

相关问题