python - 如何使用 Sqlalchemy 创建序列并将该特定序列添加到表中?
问题描述
rollback.py :
def write_to_db(dataset_id):
try:
initialize_datamodels()
EpdUmpPushRollback = datamodels.relational_tables.EpdUmpPushRollback
with session_scope() as session:
epdumppushrollback_obj = EpdUmpPushRollback()
epdumppushrollback_obj.dataset_id = dataset_id
epdumppushrollback_obj.record_id = ''
epdumppushrollback_obj.operator_name = 'vis'
epdumppushrollback_obj.activation_flag = 'active'
epdumppushrollback_obj.record_creation_time = now()
epdumppushrollback_obj.start_time = now()
session.add(epdumppushrollback_obj)
session.flush()
except Exception as e:
#err = "Error in updating the table epd_ump_push_rollback "
#_log.exception(err)
_log.exception("Error in updating the table {}".format(e))
table.py :
"""epd_ump_push_rollback_table
Revision ID: 4e4d99a8e544
Revises: c010f4d4b319
Create Date: 2018-12-19 18:04:30.271380
"""
from alembic import op
from sqlalchemy import Column, String, INTEGER, VARCHAR, NVARCHAR, TIMESTAMP, \
Enum, ForeignKey, Sequence, MetaData
# revision identifiers, used by Alembic.
revision = '4e4d99a8e544'
down_revision = '2396e1b7de5c'
branch_labels = None
depends_on = None
meta = MetaData()
seq_obj = Sequence('record_id_seq', metadata=meta)
def upgrade():
activation_flag_state = Enum('active', 'inactive', name="activation_flag_state")
op.create_table('epd_ump_push_rollback',
Column('dataset_id', String, ForeignKey('epd_ip_dataset.dataset_id'),
primary_key=True),
Column('record_id', INTEGER, seq_obj, server_default=seq_obj.next_value(),
primary_key=True),
Column('operator_name', String, nullable=False),
Column('activation_flag', activation_flag_state, nullable=False),
Column('record_creation_time', TIMESTAMP),
Column('start_time', TIMESTAMP),
Column('end_time', TIMESTAMP))
def downgrade():
op.drop_table('epd_ump_push_rollback')
op.execute('DROP type activation_flag_state')
解释:
在rollback.py
我正在写入 db.xml 的文件中。我正在db(postgresql)
使用 using设置会话with session_scope() as session:
。我正在创建一个表对象EpdUmpPushRollback
并适当地设置这些值。该列record_id
应该作为我定义的序列生成,table.py
并且我正在使用 alembic 将我的模式升级到将具有表的新模式EpdUmpPushRollback
。
我现在有两个问题。
- 对于我们定义了序列的列,是强制添加
pdumppushrollback_obj.record_id = ''
还是自动添加? - 序列的名称应该是什么,每当我尝试在表中添加任何条目时,它都会引发此错误。
错误:sqlalchemy.exc.ProgrammingError:(psycopg2.ProgrammingError)“record_id_seq”不是序列[SQL:'INSERT INTO epd_ump_push_rollback(dataset_id,operator_name,activation_flag,record_creation_time,start_time,end_time)值(%(dataset_id)s,%( operator_name)s, %(activation_flag)s, now(), now(), %(end_time)s) 返回 epd_ump_push_rollback.record_id'] [参数: {'dataset_id': '20181221_1200_mno', 'operator_name': 'vis', 'activation_flag':'活动','end_time':无}]
解决方案
我曾经遇到过这个问题,为了解决它,我创建了序列,所以你可以试试这个 postgres 语句:
CREATE SEQUENCE record_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
推荐阅读
- c - 在 C 中解析 tzdata 数据库的工具
- python - 从烧瓶应用程序执行 bash 命令
- git - 我应该避免在私有 git 存储库中使用密钥吗?
- arduino-uno - 在 DELPHI / ARDUINO 界面中查找 HID/PID
- powershell - 脚本绕过我的 for 循环来搜索多少个文件夹
- vaticle-typedb - grakn grqal 匹配查询返回的结果少于预期
- javascript - 正则表达式替换标签在多行中产生
- javascript - 替换在 reactjs 中不起作用
- csh - if: 表达式语法 - 在 C Shell 脚本中
- c# - ADOMD.Net 查询结果不正确