Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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 从csv中添加一组行,然后继续计算主键(postgres、sqlalchemy)_Python_Postgresql_Sqlalchemy_Primary Key_Flask Sqlalchemy - Fatal编程技术网

Python 从csv中添加一组行,然后继续计算主键(postgres、sqlalchemy)

Python 从csv中添加一组行,然后继续计算主键(postgres、sqlalchemy),python,postgresql,sqlalchemy,primary-key,flask-sqlalchemy,Python,Postgresql,Sqlalchemy,Primary Key,Flask Sqlalchemy,我有一个postgres数据库,我主要使用sqlalchemy(通过flask sqlalchemy)在python中与之交互。我希望能够从CSV直接在psql中添加表的初始数据,然后能够在以后以编程方式添加新行 但是我的主键有问题。具体地说,如果我将其包含在初始数据的csv文件中,那么当我尝试以编程方式添加新行时,新行尝试将主键从1开始,并立即失败,因为该键已经存在 详细信息和代码 我的sqlalchemy代码的相关部分: class Contracts(db.Model): __ta

我有一个postgres数据库,我主要使用sqlalchemy(通过flask sqlalchemy)在python中与之交互。我希望能够从CSV直接在psql中添加表的初始数据,然后能够在以后以编程方式添加新行

但是我的主键有问题。具体地说,如果我将其包含在初始数据的csv文件中,那么当我尝试以编程方式添加新行时,新行尝试将主键从1开始,并立即失败,因为该键已经存在

详细信息和代码

我的sqlalchemy代码的相关部分:

class Contracts(db.Model):
    __tablename__ = "contracts"
    id = db.Column(db.Integer, primary_key=True)
    contract = db.Column(db.Text())
    # a bunch of other columns that are irrelevant follow here

    def __init__(self, contract, url, firstadded, firstaddedby):
        self.contract = contract
        # and all the other irrelevant columns.  
        # not ID, because that's to be auto-incremented.
>>>from database import Contracts
>>> k = Contracts("here's some text", "url column", "firstadded column", "firstaddedby column")
>>> db.session.add(k)
>>> db.session.commit()
然后,我使用以下命令从python shell创建表:

>>> from app import db
>>> db.create_all()
确认这产生了我所期望的,psql中前两行
\d+合同的相关部分:

id      | integer        | not null default nextval('contracts_id_seq'::regclass)
contract| text           |
因此,我有一个csv文件,如下所示:

1,this is a word,http://foo.bar,never,test,f,,,,,
2,this is a word or t20,http://foo.baz,never,test,f,,,,,
我将其从psql添加到contracts表中,如下所示:
\使用(csv格式)将合同从“路径/复制到/csv/文件”

而且,正如预期的那样,从表中选择将显示两行,ID为1和2

但是,假设我打开一个shell并尝试使用sqlalchemy代码输入一些数据:

class Contracts(db.Model):
    __tablename__ = "contracts"
    id = db.Column(db.Integer, primary_key=True)
    contract = db.Column(db.Text())
    # a bunch of other columns that are irrelevant follow here

    def __init__(self, contract, url, firstadded, firstaddedby):
        self.contract = contract
        # and all the other irrelevant columns.  
        # not ID, because that's to be auto-incremented.
>>>from database import Contracts
>>> k = Contracts("here's some text", "url column", "firstadded column", "firstaddedby column")
>>> db.session.add(k)
>>> db.session.commit()
但它失败了,出现了预期的错误(在相关部分)
(psycopg2.integrityyror)重复键值违反了唯一约束“contracts\u pkey”
详细信息:密钥(id)=(1)已存在。

我试图从csv中删除第一列,或者将其留空,理论上,如果没有提供,posgres可能会被说服启动一个自动递增索引。但在这两种情况下,导入csv都失败---删除失败,因为它将第二列视为id,并导致整数的
输入语法无效--
--添加空列失败,因为它违反了NOTNULL约束

帮忙?当然,有一种简单的方法可以从csv中添加行,然后继续计算主键的结束位置?

导入后,您只需:

select setval('contracts_id_seq', max(id)) from contracts;