【问题标题】:Syntax error when trying to insert record into posgtresql using pg8000 driver尝试将记录插入 postgresql 时出现语法错误
【发布时间】:2022-01-20 07:01:23
【问题描述】:

当我尝试将记录插入 Postgresql 时,我遇到了错误。

pg8000.exceptions.DatabaseError: {'S': 'ERROR', 'V': 'ERROR', 'C': '42601', 'M': '在“,”或附近出现语法错误P':'345','F':'scan.l','L':'1150','R':'scanner_yyerror'}

下面是我遇到错误的python代码sn-p:

def insert_data(metadata):
    if type(metadata) == dict: metadata = [metadata]
    print("Metadata = ", metadata)
    for detail in metadata:
        detail["dismissed"] = check_if_dismissed(detail["uuid"])
        cols = ",".join(detail.keys())
        print("Cols: ", cols)
        qmarks = ','.join(['?' for s in detail.keys()])
        print("Qmarks: ", qmarks)
        # values = [v for v in detail.values()]
        values = []
        for v in detail.values():
            if isinstance(v, list):
                values.append(json.dumps(v))
            else:
                values.append(v)
        print("Values: ", values)
        insert_statement = "INSERT INTO %s (%s) VALUES (%s);" % (TABLE_NAME, cols, qmarks)
        print("Insert Statement: ", insert_statement)
        conn = get_conn()
        conn.insert_record(insert_statement, str(values))

谁能帮我解决这个错误?

【问题讨论】:

    标签: python python-3.x postgresql pg8000


    【解决方案1】:

    pg8000 对值使用“名称”样式的占位符

    SELECT * FROM tbl WHERE name = :name
    

    作为关键字参数传递给连接的run 方法。目前尚不清楚conn.insert_record 是什么——我在 pg8000 的自述文件中没有看到它——但要使用 pg8000 构建类似的语句,您可以这样做:

    import pg8000.native
    
    DDL = """CREATE TABLE IF NOT EXISTS table_name (
      name varchar,
      age integer
    )
    """
    
    
    conn = pg8000.native.Connection(...)
    conn.run(DDL)
    
    table = 'table_name'
    data = {'name': 'Alice', 'age': 42}
    cols = ', '.join(f'"{k}"' for k in data.keys())
    vals = ', '.join(f':{k}' for k in data.keys())
    stmt = f"""INSERT INTO "{table}" ({cols}) VALUES ({vals})"""
    conn.run(stmt, **data)
    conn.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      相关资源
      最近更新 更多