psql TypeError:在字符串格式化期间不是所有参数都被转换

时间:2015-06-14 21:03:28

标签: python psql

当我尝试自动生成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

我搜索了几个小时但仍感到困惑。谁能帮我这个?非常感谢!

2 个答案:

答案 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)

因此,将逗号更改为%会将变量传递给字符串并且可以正常工作,但另一种方式会对输入进行清理,因此您应该按原样使用第二个示例。