-1

因此,我有一个要插入数据库的格式化字符串列表,它们已格式化,因此数据库将接受这种类型的字符串。

以下是格式示例:

mylist = [('123456789'), ('987654321'), ('1234554321'),....('9999999999')]
mylist[0] = ('123456789')

必须保留格式以确保正确输入。

我想确保它对sql注入是安全的,

我知道这有效:

database = connection.cursor()
for data in mylist:
    command = " INSERT INTO my_table(my_value) VALUES %s" %data
    database.execute(command)
connection.commit()

但是我不确定这是否是防止sql注入的正确方法

我更愿意做但它不起作用的是:

database = connection.cursor()
for data in mylist:
    command = " INSERT INTO my_table(my_value) VALUES %s"
    database.execute(command, (data))
connection.commit()

我收到的错误是:

'str' object is not callable

我在网上看到是正确的,为什么它不起作用

4

2 回答 2

3

你需要传入一个元组:

database.execute(command, (data,))

注意逗号!你也可以传入一个列表:

database.execute(command, [data])

由于您有一个要插入的值列表,您可以使用cursor.executemany()让数据库一次性应用所有值,但您需要将列表中的每个元素都设为元组或列表:

with connection:
    with connection.cursor() as cursor:
        command = "INSERT INTO my_table(my_value) VALUES %s"
        cursor.executemany(command, ((data,) for data in mylist))

请注意,您可以将连接和游标用作上下文管理器。当with连接块结束时,事务会自动为您提交,除非发生异常,此时事务被回滚。cursor上下文管理器关闭游标,释放与游标关联的资源。请参阅psycopg2文档

于 2015-12-07T10:50:31.910 回答
1

很难理解你的意思。这是我的尝试:

mylist = ['123456789','987654321','1234554321','9999999999']
mylist = [tuple(("('{0}')".format(s),)) for s in mylist]
records_list_template = ','.join(['%s'] * len(mylist))
insert_query = '''
    insert into t (s) values
    {0}
'''.format(records_list_template)
print cursor.mogrify(insert_query, mylist)
cursor.execute(insert_query, mylist)
conn.commit()

输出:

insert into t (s) values
('(''123456789'')'),('(''987654321'')'),('(''1234554321'')'),('(''9999999999'')')

插入的元组:

select * from t;
       s        
----------------
 ('123456789')
 ('987654321')
 ('1234554321')
 ('9999999999')
于 2015-12-07T14:25:46.490 回答