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

How to create a string sequence in SQLAlchemy

提问人:Vitalij Gurin 提问时间:9/27/2023 更新时间:9/27/2023 访问量:35

问:

我目前正在开发一个用于发票的 API。我想创建一个带有 invoiceNumber 字段的 Invoice 表,该字段将自动递增,但作为字符串。像这样的东西:

  1. INV00001
  2. INV00002
  3. INV00003

是否可以使用 SQLAlchemy 以某种方式做到这一点?

我尝试使用 SQLAlchemy 中的 Sequence 函数,但我知道它仅适用于整数。

python postgresql sqlalchemy 序列 自动递增

评论


答:

0赞 snakecharmerb 9/27/2023 #1

使用 Gordon Linoff这个答案中的 SQL,我们可以定义一个默认的列,该列结合了整数序列和字符串前缀,如下所示:

import sqlalchemy as sa

engine = sa.create_engine('postgresql+psycopg2:///test', echo=True)

tbl = sa.Table(
    't77185472',
    sa.MetaData(),
    sa.Column(
        'strseq',
        sa.String,
        server_default=sa.text(
            """('INV' || lpad(nextval('test_seq')::text, 6, '0'))"""
        ),
    ),
)

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

@sa.event.listens_for(tbl, 'after_drop')
def receive_after_drop(target, connection, **kw):
    """Drop the sequence if `tbl` is dropped."""
    connection.execute(sa.text("""DROP SEQUENCE IF EXISTS test_seq"""))


@sa.event.listens_for(tbl, 'before_create')
def receive_before_create(target, connection, **kw):
    """Create the sequence before `tbl` is created."""
    connection.execute(sa.text("""CREATE SEQUENCE test_seq"""))