我想在我的数据库中插入一个列表,但我不能.
这是我需要的一个例子:
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文档开头的示例显示了如何使用问号传递参数,并解释了为什么它们是必要的(实质上,它确保正确引用您的变量).
您的问题不清楚。
您是否要将列表作为逗号分隔的文本字符串插入数据库的单个列中?还是要将每个元素插入单独的列中?两者皆有可能,但技术不同。
将以逗号分隔的列表插入一列:
Run Code Online (Sandbox Code Playgroud)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)
两者都假设您已建立连接名称conn。
其他一些建议:
尽量避免INSERT语句没有列出要插入的列的名称和顺序。这种陈述导致非常脆弱的代码。如果在表中添加,删除或移动列,则会中断。
如果要将逗号分隔的列表插入到单个字段中,通常会违反数据库设计的原则,因此应使用单独的表,每条记录一个值。
如果要插入单独的字段,并且它们具有类似Word1和的名称Word2,则同样表明您应该使用单独的表。
切勿使用直接字符串替换来创建SQL语句。例如,如果其中一个值为,它将中断o'clock。它还使您容易受到使用SQL注入技术的人们的攻击。