Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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
从SQlite切换后,无法在Postgresql中为Flask Sqlalchemy插入NULL作为主键值_Postgresql_Sqlite_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

从SQlite切换后,无法在Postgresql中为Flask Sqlalchemy插入NULL作为主键值

从SQlite切换后,无法在Postgresql中为Flask Sqlalchemy插入NULL作为主键值,postgresql,sqlite,sqlalchemy,flask-sqlalchemy,Postgresql,Sqlite,Sqlalchemy,Flask Sqlalchemy,我最近开始将一个SQLite数据库移植到PostGreSQL,用于使用SQLAlchemy构建的Flask站点。我在PGSQL中有我的模式,甚至将数据插入到数据库中。但是,我无法运行常用的INSERT命令向数据库添加信息。通常,我使用SQL Alchemy插入新记录,方法是将ID列保留为NULL,然后只设置其他列。但是,这会导致以下错误: sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) null value in column "

我最近开始将一个SQLite数据库移植到PostGreSQL,用于使用SQLAlchemy构建的Flask站点。我在PGSQL中有我的模式,甚至将数据插入到数据库中。但是,我无法运行常用的INSERT命令向数据库添加信息。通常,我使用SQL Alchemy插入新记录,方法是将ID列保留为NULL,然后只设置其他列。但是,这会导致以下错误:

sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) null value in column "id" violates not-null constraint
DETAIL:  Failing row contains (null, 2017-07-24 20:40:37.787393+00, 2017-07-24 20:40:37.787393+00, episode_length_list = [52, 51, 49, 50, 83]

sum_length = 0

for ..., 0, f, 101, 1, 0, 0, , null).
 [SQL: 'INSERT INTO submission (date_created, date_modified, code, status, correct, assignment_id, course_id, user_id, assignment_version, version, url) VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, %(code)s, %(status)s, %(correct)s, %(assignment_id)s, %(course_id)s, %(user_id)s, %(assignment_version)s, %(version)s, %(url)s) RETURNING submission.id'] [parameters: {'code': 'episode_length_list = [52, 51, 49, 50, 83]\n\nsum_length = 0\n\nfor episode_length in episode_length_list:\n    pass\n\nsum_length = sum_length + episode_length\n\nprint(sum_length)\n', 'status': 0, 'correct': False, 'assignment_id': 101, 'course_id': None, 'user_id': 1, 'assignment_version': 0, 'version': 0, 'url': ''}]
以下是我的SQL Alchemy表声明:

class Base(Model):
    __abstract__  = True
    @declared_attr
    def __tablename__(cls):
        return cls.__name__.lower()
    def __repr__(self):
        return str(self)

    id =  Column(Integer(), primary_key=True)
    date_created  = Column(DateTime, default=func.current_timestamp())
    date_modified = Column(DateTime, default=func.current_timestamp(),
                                     onupdate=func.current_timestamp())

class Submission(Base):
    code = Column(Text(), default="")
    status = Column(Integer(), default=0)
    correct = Column(Boolean(), default=False)
    assignment_id = Column(Integer(), ForeignKey('assignment.id'))
    course_id = Column(Integer(), ForeignKey('course.id'))
    user_id = Column(Integer(), ForeignKey('user.id'))
    assignment_version = Column(Integer(), default=0)
    version = Column(Integer(), default=0)
    url = Column(Text(), default="")
我通过在脚本中调用
db.create_all()
创建了模式

检查PostGreSQL端,我们可以看到构造的表:

                                     Table "public.submission"
       Column       |           Type           | Modifiers | Storage  | Stats target | Description
--------------------+--------------------------+-----------+----------+--------------+-------------
 id                 | bigint                   | not null  | plain    |              |
 date_created       | timestamp with time zone |           | plain    |              |
 date_modified      | timestamp with time zone |           | plain    |              |
 code               | text                     |           | extended |              |
 status             | bigint                   |           | plain    |              |
 correct            | boolean                  |           | plain    |              |
 assignment_id      | bigint                   |           | plain    |              |
 user_id            | bigint                   |           | plain    |              |
 assignment_version | bigint                   |           | plain    |              |
 version            | bigint                   |           | plain    |              |
 url                | text                     |           | extended |              |
 course_id          | bigint                   |           | plain    |              |
Indexes:
    "idx_16881_submission_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "submission_course_id_fkey" FOREIGN KEY (course_id) REFERENCES course(id)
    "submission_user_id_fkey" FOREIGN KEY (user_id) REFERENCES "user"(id)
Has OIDs: no
我还是个新手,但不应该有一个序列吗


任何关于下一步要寻找什么的见解或建议都将不胜感激。

标准SQL是
主键
唯一的
,并且
不为空
。PostgreSQL强制执行该标准,并且不允许在表上有任何(不是一个)
NULL
。其他数据库允许您有一个
NULL
,因此,行为不同

PostgreSQL明确指出:

5.3.4。主键

主键约束表示一列或一组列可以用作表中行的唯一标识符。这要求值必须是唯一的且不为null

如果您希望您的
主键
是合成(即:非自然)序列号,则应使用类型
BIGSERIAL
而不是
BIGINT
来定义它。我不知道如何使用SQLAlchemy实现这一点的细节,但请看参考资料

然后将
INSERT
插入到表中时,
id
不应位于
INSERT
列列表中(不应设置为null,只是不存在)。即:

这将生成一个新id:

INSERT INTO public.submission (code) VALUES ('Some code') ;
会有用的

这不会:

INSERT INTO public.submission (id, code) VALUES (NULL, 'Some code') ;
我想SQLAlchemy应该足够聪明,能够在正确配置后生成正确的SQL INSERT语句


参考:


标准SQL是
主键
是唯一的
并且
不为空。PostgreSQL强制执行该标准,并且不允许在表上有任何(不是一个)
NULL
。其他数据库允许您有一个
NULL
,因此,行为不同

PostgreSQL明确指出:

5.3.4。主键

主键约束表示一列或一组列可以用作表中行的唯一标识符。这要求值必须是唯一的且不为null

如果您希望您的
主键
是合成(即:非自然)序列号,则应使用类型
BIGSERIAL
而不是
BIGINT
来定义它。我不知道如何使用SQLAlchemy实现这一点的细节,但请看参考资料

然后将
INSERT
插入到表中时,
id
不应位于
INSERT
列列表中(不应设置为null,只是不存在)。即:

这将生成一个新id:

INSERT INTO public.submission (code) VALUES ('Some code') ;
会有用的

这不会:

INSERT INTO public.submission (id, code) VALUES (NULL, 'Some code') ;
我想SQLAlchemy应该足够聪明,能够在正确配置后生成正确的SQL INSERT语句


参考:


最终,我发现了哪里出了问题,这肯定是我的错。我用来将旧数据加载到数据库()中的过程不仅仅是加载数据——它以某种方式覆盖了部分表定义!我能够pg_转储数据,重置表,然后重新加载-一切正常。谢谢你的健康检查

最终,我发现了哪里出了问题,这肯定是我的错。我用来将旧数据加载到数据库()中的过程不仅仅是加载数据——它以某种方式覆盖了部分表定义!我能够pg_转储数据,重置表,然后重新加载-一切正常。谢谢你的健康检查

好的,但是我需要做什么来正确配置它呢?参考资料似乎没有说明我做错了什么。那张海报是在定义他们自己的序列,我认为我不应该这样做。这难道不应该奏效吗?@AustinCoryBart“那张海报是在定义他们自己的序列”,以解释当你这样做时会发生什么。他们还展示了如何正确地做这件事,也就是说,要结束这个谜,那是我的错。SQLAlchemy做了正确的事情,我只是通过使用pgloader覆盖了它的工作。基本上,我是个白痴。@AustinCoryBart:你和我们其他人一样都是人。如果您认为您有一个答案(可能是您自己的答案),请将其标记为已接受,以便人们可以集中精力处理大量未回答的答案。我发布了所发生事情的摘要,但不允许我在接下来的2天内将其标记为已批准:/n好的,但我需要如何正确配置它?参考资料似乎没有说明我做错了什么。那张海报是在定义他们自己的序列,我认为我不应该这样做。这难道不应该奏效吗?@AustinCoryBart“那张海报是在定义他们自己的序列”,以解释当你这样做时会发生什么。他们还展示了如何正确地做这件事,也就是说,要结束这个谜,那是我的错。SQLAlchemy做了正确的事情,我只是通过使用pgloader覆盖了它的工作。基本上,我是个白痴。@AustinCoryBart:你和我们其他人一样都是人。如果你认为你有答案(可能是你自己的答案),请将其标记为已接受,这样人们就可以集中精力处理大量未回答的问题,