Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为sqlalchemy中的主键列配置序列对象?_Python_Postgresql_Sqlalchemy_Sequence - Fatal编程技术网

Python 如何为sqlalchemy中的主键列配置序列对象?

Python 如何为sqlalchemy中的主键列配置序列对象?,python,postgresql,sqlalchemy,sequence,Python,Postgresql,Sqlalchemy,Sequence,我希望在添加到数据库或初始化时,MediaFolder类自动生成id。我试过: from sqlalchemy import Column, String, BigInteger, ForeignKey, Sequence from __init__ import Base class MediaFolder(Base): __tablename__ = 'media_folder' seq = Sequence('id', start=20000000) id =

我希望在添加到数据库或初始化时,
MediaFolder
类自动生成
id
。我试过:

from sqlalchemy import Column, String, BigInteger, ForeignKey, Sequence
from __init__ import Base


class MediaFolder(Base):
    __tablename__ = 'media_folder'

    seq = Sequence('id', start=20000000)
    id = Column(BigInteger, server_default=seq.next_value(), primary_key=True)

    name = Column(String, nullable=False)

    username = Column(String, nullable=False)

x = MediaFolder()
x.name = 'test seq'
x.username = 'test seq u'


from __init__ import db_session
db_session.add(x)
db_session.commit()
但当执行时,我得到:

Traceback (most recent call last):
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1249, in _execute_context
    cursor, statement, parameters, context
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 580, in do_execute
    cursor.execute(statement, parameters)
psycopg2.errors.NotNullViolation: null value in column "id" violates not-null constraint
DETAIL:  Failing row contains (null, test seq, test seq u, null).


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:/Users/Krzysiek/Desktop/praca/media_library/media/media_folder.py", line 29, in <module>
    db_session.commit()
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\orm\scoping.py", line 162, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 1027, in commit
    self.transaction.commit()
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 494, in commit
    self._prepare_impl()
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 473, in _prepare_impl
    self.session.flush()
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 2470, in flush
    self._flush(objects)
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 2608, in _flush
    transaction.rollback(_capture_exception=True)
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\util\langhelpers.py", line 68, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 153, in reraise
    raise value
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\orm\session.py", line 2568, in _flush
    flush_context.execute()
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 422, in execute
    rec.execute(self)
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 589, in execute
    uow,
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\orm\persistence.py", line 245, in save_obj
    insert,
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\orm\persistence.py", line 1137, in _emit_insert_statements
    statement, params
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 988, in execute
    return meth(self, multiparams, params)
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\sql\elements.py", line 287, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1107, in _execute_clauseelement
    distilled_params,
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1253, in _execute_context
    e, statement, parameters, cursor, context
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1473, in _handle_dbapi_exception
    util.raise_from_cause(sqlalchemy_exception, exc_info)
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 398, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 152, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1249, in _execute_context
    cursor, statement, parameters, context
  File "C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 580, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.IntegrityError: (psycopg2.errors.NotNullViolation) null value in column "id" violates not-null constraint
DETAIL:  Failing row contains (null, test seq, test seq u, null).

[SQL: INSERT INTO media_folder (name, username) VALUES (%(name)s, %(username)s) RETURNING media_folder.id]
[parameters: {'name': 'test seq', 'username': 'test seq u'}]
(Background on this error at: http://sqlalche.me/e/gkpj)
回溯(最近一次呼叫最后一次):
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\engine\base.py”,第1249行,在执行上下文中
游标、语句、参数、上下文
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\engine\default.py”,第580行,在do\u execute中
cursor.execute(语句、参数)
psycopg2.errors.NotNullViolation:列“id”中的null值违反了非null约束
详细信息:失败行包含(null、测试序列、测试序列u、null)。
上述异常是以下异常的直接原因:
回溯(最近一次呼叫最后一次):
文件“C:/Users/Krzysiek/Desktop/praca/media_library/media/media_folder.py”,第29行,在
db_session.commit()
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\orm\scoping.py”,第162行,在do中
返回getattr(self.registry(),name)(*args,**kwargs)
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\orm\session.py”,第1027行,在提交中
self.transaction.commit()
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\orm\session.py”,第494行,在提交中
self.\u prepare\u impl()
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\orm\session.py”,第473行,在\u prepare\u impl中
self.session.flush()
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\orm\session.py”,第2470行,刷新
自冲洗(对象)
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\orm\session.py”,第2608行,在\u flush中
事务.rollback(\u capture\u exception=True)
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\util\langhelpers.py”,第68行,在退出时__
兼容性(exc_类型、exc_值、exc_tb)
文件“C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py”,第153行,重新登录
增值
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\orm\session.py”,第2568行,在\u flush中
flush_context.execute()
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\orm\unitofwork.py”,执行中第422行
rec.execute(self)
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\orm\unitofwork.py”,执行中第589行
uow,
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\orm\persistence.py”,第245行,在save_obj中
插入,
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\orm\persistence.py”,第1137行,在_emit\u insert\u语句中
声明,参数
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\engine\base.py”,第988行,在execute中
返回方法(自身、多线程、参数)
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\sql\elements.py”,第287行,在连接上执行
返回连接。_execute_clauseelement(self、multiparams、params)
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\engine\base.py”,第1107行,在执行子句元素中
你的参数,
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\engine\base.py”,第1253行,在执行上下文中
e、 语句、参数、游标、上下文
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\engine\base.py”,第1473行,在_handle\u dbapi\u异常中
util.raise\u from\u cause(sqlalchemy\u异常,exc\u信息)
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\util\compat.py”,第398行,从原因开始
重新释放(类型(异常),异常,tb=exc\U tb,原因=原因)
文件“C:\Users\Krzysiek\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py”,第152行,在reraise中
通过_回溯(tb)提升值
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\engine\base.py”,第1249行,在执行上下文中
游标、语句、参数、上下文
文件“C:\Users\Krzysiek\Anaconda3\lib\site packages\sqlalchemy\engine\default.py”,第580行,在do\u execute中
cursor.execute(语句、参数)
sqlalchemy.exc.IntegrityError:(psycopg2.errors.NotNullViolation)列“id”中的null值违反了NotNull约束
详细信息:失败行包含(null、测试序列、测试序列u、null)。
[SQL:将值(%(名称)s、%(用户名)s)插入media_文件夹(名称、用户名)并返回media_文件夹.id]
[参数:{'name':'test seq','username':'test seq u'}]
(有关此错误的背景信息,请访问:http://sqlalche.me/e/gkpj)
基本上
id
返回null。我已经尽了一切努力来解决这个问题或者理解这个序列。
如何正确生成
id
值?或者在sqlalchemy中是否有其他自动生成值的方法?

您可以创建序列作为id列声明的一部分

class MediaFolder(Base):
    __tablename__ = 'media_folder'

    seq = Sequence('id', start=20000000)
    id = Column(BigInteger, Sequence('media_folder_id', start=20000000), primary_key=True)

    name = Column(String, nullable=False)
    username = Column(String, nullable=False)
这是执行代码后数据库中的内容:

test=#\d媒体文件夹\u id
序列“public.media\u文件夹\u id”
类型|开始|最小|最大|增量|循环|隐藏物
--------+----------+---------+---------------------+-----------+---------+-------
bigint | 20000000 | 1 | 9223372036854775807 | 1 | no | 1
测试=#从媒体文件夹中选择*;
id |名称|用户名
----------+----------+------------
20000000 |测试顺序|测试顺序u

(最好给序列一个比“id”更独特的名称)。

就是这样。它仍然不起作用。我试着按照你提问之前的方式来做,但没有成功。不过,谢谢你,至少我知道问题不在于植入。