当我尝试自动生成pid时,我遇到了麻烦
CREATE TABLE players(
pID SERIAL primary key,
pName VARCHAR(90) not null
);
这是我的功能
def addPlayer(name):
conn = connect()
cur = conn.cursor()
cur.execute("INSERT INTO players(pName) VALUES(%s)",name)
conn.commit()
我用
调用该函数 addPlayer('Vera')
我一直收到错误
cur.execute("INSERT INTO players(pName) VALUES(%s)",name)
TypeError: not all arguments converted during string formatting
我搜索了几个小时但仍感到困惑。谁能帮我这个?非常感谢!
答案 0 :(得分:2)
您需要传递一个元组或列表作为要执行的第二个参数。
当在查询中有多个替换时,元组看起来"正常"像这样:(姓名,年龄)。
在你的情况下,你需要添加一个只有一个部分的元组。写入的简短但有点不寻常的方法是使用(name,)作为第二个参数。
因此:
cur.execute("INSERT INTO players(pName) VALUES(%s)",(name,))
虽然使用起来比较常见吗?作为替换字符,看起来像这样:
cur.execute("INSERT INTO players(pName) VALUES(?)",(name,))
答案 1 :(得分:1)
我认为您将字符串插值与查询变量混淆。
字符串插值:
name = "Ben"
print("Hello, my name is %s" % name)
names = ["Adam", "Ben", "Charlie"]
print("Hello, our names are %s, %s and %s" % names)
查询变量:
values = [name]
cur.execute("INSERT INTO players(pName) VALUES(?)", values)
因此,将逗号更改为%
会将变量传递给字符串并且可以正常工作,但另一种方式会对输入进行清理,因此您应该按原样使用第二个示例。