值错误:索引 %Id 处不支持格式字符“d”(0x64)

问题描述 投票:0回答:2

我尝试在表中插入整数值,但我遇到了“值错误”

import psycopg2

def connect():
    con=psycopg2.connect("dbname='book_store' user='postgres' password='5283' host='localhost' port='5432' ")
    cur=con.cursor()
    cur.execute("CREATE TABLE if not exists books(id SERIAL PRIMARY KEY,title TEXT NOT NULL,author TEXT NOT NULL,year integer NOT NULL,isbn integer NOT NULL)")
    con.commit()
    con.close()

def insert(title,author,year,isbn):
    con=psycopg2.connect("dbname='book_store' user='postgres' password='5283' host='localhost' port='5432'")
    cur=con.cursor()
    cur.execute("INSERT INTO books(title,author,year,isbn) VALUES(%s,%s,%d,%d)",(title,author,year,isbn))
    con.commit()
    con.close()


connect()
insert("the sun","helen",1997,23456777)

python-3.x postgresql psycopg2
2个回答
14
投票

来自 Psycopg 常见问题解答

问:我无法将整数或浮点参数传递给我的查询:它说 数字是必填项,但它是数字!

A:在查询字符串中,即使传递数字,也始终必须使用 %s 占位符。所有 Python 对象均由 Psycopg 转换为 它们的 SQL 表示形式,因此它们作为字符串传递给查询。 请参阅将参数传递给 SQL 查询。

所以我想你只需要将

%d
替换为
%s


0
投票

从 pycopg 文档中我们可以找到这一行

变量占位符必须始终为 %s,即使不同的占位符(例如整数的 %d 或浮点数的 %f)可能看起来更适合该类型。您可能会发现 Psycopg 查询中使用了其他占位符(%b 和 %t),但它们与参数类型无关:

来源参见文档

© www.soinside.com 2019 - 2024. All rights reserved.