Python psycopg2 语法错误

4
我是新手,在使用psycopg2向postgres数据库插入数据。我正在尝试插入项目,但收到错误消息并且在coffee cup旁边有一个^符号。我认为顺序可能错了,但是只要指定了值,您就可以以这种方式输入它。下面是代码:
import psycopg2

def create_table():
    conn=psycopg2.connect("dbname='db1' user='postgres' password='postgress123' host='localhost' port='5432'")
    cur=conn.cursor()
    cur.execute("CREATE TABLE IF NOT EXISTS store (item TEXT, quantity INTEGER, price REAL)")
    conn.commit()
    conn.close()

def insert(quantity, price, item):
    conn=psycopg2.connect("dbname='db1' user='postgres' password='postgress123' host='localhost' port='5432'")
    cur=conn.cursor()
    cur.execute("INSERT INTO store VALUES(%s,%s,%s)" % (quantity, price, item))
    conn.commit()
    conn.close()

create_table()
insert(7, 10.5, 'coffee cup')

1
不要直接在 SQL 查询中进行字符串插值操作,否则会使你容易受到 SQL 注入攻击 的威胁。在这种情况下,它还可能导致查询格式不正确。 - Paul Rooney
谢谢Paul。我对Python和Psycopg2非常陌生,正在网上查找示例以了解其工作原理。在这种情况下,您如何避免代码中的SQL注入? Psycocg2文档建议无论传递什么类型的数据都应使用%s。任何帮助将不胜感激。 - IpSp00f3r
3个回答

7

请始终使用 execute 命令的第二个参数来传递变量,如 此处所述

另外,在语法中使用字段名称:

cur.execute("INSERT INTO store (item, quantity, price) VALUES (%s, %s, %s);", (item, quantity, price))

那应该就可以解决了。

这个很顺利地运行了。感谢您指引我正确的方向。 - IpSp00f3r

1
在您的情况下,问题在于 coffee cup 参数值被视为字符串,但 psycopg2 接受单引号中的值。 基本上根据我的理解,当我们为 psycopg2 创建 SQL 查询时,它要求使用单引号来表示数据参数 [如果您已经给出了查询的双引号开头和结尾]。 在您的情况下,您已经为查询开头和结尾给出了双引号,因此需要为参数提供单引号。
我的观察是在psycopg2中你为每个数据参数提供了单引号。
import psycopg2

def create_table():
    conn=psycopg2.connect("dbname='db1' user='postgres' password='postgress123' host='localhost' port='5432'")
    cur=conn.cursor()
    cur.execute("CREATE TABLE IF NOT EXISTS store (item TEXT, quantity INTEGER, price REAL)")
    conn.commit()
    conn.close()

def insert(quantity, price, item):
    conn=psycopg2.connect("dbname='db1' user='postgres' password='postgress123' host='localhost' port='5432'")
    cur=conn.cursor()
    #cur.execute("INSERT INTO store VALUES(%s,%s,%s)" % (quantity, price, item))
    cur.execute("INSERT INTO store VALUES('%s','%s','%s')" % (quantity, price, item))
    conn.commit()
    conn.close()

create_table()
insert(7, 10.5, 'coffee cup')

0

我也遇到了同样的问题,在排除代码问题一段时间后,我发现在插入查询中忘记添加逗号(,)了。

导致错误的代码:

data['query'] = 'insert into contacts (name, contact_no, alternate_contact_no, email_id, address)' \
                'values (%s %s %s %s %s)'

如您所见,在上述代码中,我忘记在每个'%s'后面添加逗号。
正确的代码:
data['query'] = 'insert into contacts (name, contact_no, alternate_contact_no, email_id, address)' \
                'values (%s, %s, %s, %s, %s)'

希望能对你有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接