upsert insert更新的正确语法psycopg2

时间:2018-05-23 15:46:45

标签: postgresql upsert parameterized

我有一个我在postgresql中创建的表:

> CREATE TABLE issuer(
>     cik                            char(10) NOT null     ,issuer_name                     char(150) NOT NULL    ,trading_symbol                 char(10) NOT
> NULL    ,SIC                            char(6) NOt NULL   
> ,date_added                     timestamp NULL DEFAULT
> CURRENT_TIMESTAMP    ,CONSTRAINT issuer_pk PRIMARY key (cik)    );

我试图更新一行(如果它存在)或插入它(如果它不存在。

我已经搜索了如何使这项工作的文档,但我对我得到的错误感到困惑。

我有一个我称之为

的功能
io = postgres_update_issuer(con,cur,cik,coname,ticker,'')

当我调用此函数时,python调用线程然后退出。 这是我打电话的功能:

 def postgres_update_issuer(conn,cur,issuer_cik,name,ticker,sic):

            sql =   """
            INSERT INTO issuer ( cik,issuer_name,trading_symbol,SIC)
                  VALUES (%s,%s,%s,%s)
                     ON CONFLICT  (cik)
                     DO UPDATE SET
                        (issuer_name,trading_symbol,SIC )
                        = (EXCLUDED.issuer_name, EXCLUDED.trading_symbol,             EXCLUDED.SIC) 
                     ;"""


            try:
    #                 data = (issuer_cik,name,ticker,sic)
                    cur.execute(sql,(issuer_cik,name,ticker,sic) )
                    return True

            except (Exception, psycopg2.DatabaseError) as error:
                    print(error)

当我将函数更改为this时,我得到了无法移动所有字段的错误消息:

 def postgres_update_issuer(conn,cur,issuer_cik,name,ticker,sic):

    sql =   """
    INSERT INTO issuer ( cik,issuer_name,trading_symbol,SIC)
          VALUES (%s)
             ON CONFLICT  (cik)
             DO UPDATE SET
                (issuer_name,trading_symbol,SIC )
                = (EXCLUDED.issuer_name, EXCLUDED.trading_symbol,             EXCLUDED.SIC) 
             ;"""


    try:
            data = (issuer_cik,name,ticker,sic)
            cur.execute(sql,(data )
            return True

    except (Exception, psycopg2.DatabaseError) as error:
            print(error)

这样做的正确方法是什么。我使用的是python 3.6 psycopg2和postgresql 10

0 个答案:

没有答案