提问人:Vitalij Gurin 提问时间:9/27/2023 更新时间:9/27/2023 访问量:35
如何在SQLAlchemy中创建字符串序列
How to create a string sequence in SQLAlchemy
问:
我目前正在开发一个用于发票的 API。我想创建一个带有 invoiceNumber 字段的 Invoice 表,该字段将自动递增,但作为字符串。像这样的东西:
- INV00001
- INV00002
- INV00003
是否可以使用 SQLAlchemy 以某种方式做到这一点?
我尝试使用 SQLAlchemy 中的 Sequence 函数,但我知道它仅适用于整数。
答:
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"""))
评论