使用Python将列表插入我的数据库

mau*_*rra 9 python mysql sql

我想在我的数据库中插入一个列表,但我不能.

这是我需要的一个例子:

variable_1 = "HELLO"
variable_2 = "ADIOS"
list = [variable_1,variable_2]

INSERT INTO table VALUES ('%s') % list
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?我可以将列表作为值插入吗?当我尝试它时,错误说是因为MySQL语法中的错误

Ray*_*ger 18

原始问题的答案是:不,您不能插入这样的列表.

但是,通过一些调整,您可以通过使用%r和传入元组来使代码工作:

variable_1 = "HELLO"
variable_2 = "ADIOS"
varlist = [variable_1, variable_2]
print "INSERT INTO table VALUES %r;" % (tuple(varlist),)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种变量插入方式使您的代码容易受到SQL注入攻击.

相反,我们建议使用Python的DB API并为要插入的数据构建带有多个问号的自定义查询字符串:

variable_1 = "HELLO"
variable_2 = "ADIOS"
varlist = [variable_1,variable_2]
var_string = ', '.join('?' * len(varlist))
query_string = 'INSERT INTO table VALUES (%s);' % var_string
cursor.execute(query_string, varlist)
Run Code Online (Sandbox Code Playgroud)

SQLite3文档开头的示例显示了如何使用问号传递参数,并解释了为什么它们是必要的(实质上,它确保正确引用您的变量).


Lar*_*tig 5

您的问题不清楚。

您是否要将列表作为逗号分隔的文本字符串插入数据库的单个列中?还是要将每个元素插入单独的列中?两者皆有可能,但技术不同。

将以逗号分隔的列表插入一列:

 conn.execute('INSERT INTO table (ColName) VALUES (?);', [','.join(list)])
Run Code Online (Sandbox Code Playgroud)

插入单独的列:

  params = ['?' for item in list]
  sql    = 'INSERT INTO table (Col1, Col2. . .) VALUES (%s);' % ','.join(params)
  conn.execute(sql, list)
Run Code Online (Sandbox Code Playgroud)

两者都假设您已建立连接名称conn。

其他一些建议:

  • 尽量避免INSERT语句没有列出要插入的列的名称和顺序。这种陈述导致非常脆弱的代码。如果在表中添加,删除或移动列,则会中断。

  • 如果要将逗号分隔的列表插入到单个字段中,通常会违反数据库设计的原则,因此应使用单独的,每条记录一个值。

  • 如果要插入单独的字段,并且它们具有类似Word1和的名称Word2,则同样表明您应该使用单独的表。

  • 切勿使用直接字符串替换来创建SQL语句。例如,如果其中一个值为,它将中断o'clock。它还使您容易受到使用SQL注入技术的人们的攻击。