2024-05-14 04:05:23 发布
网友
我想在数据库中插入一个列表,但我不能
下面是我需要的一个例子:
variable_1 = "HELLO" variable_2 = "ADIOS" list = [variable_1,variable_2] INSERT INTO table VALUES ('%s') % list
这样的事能做吗?我可以插入一个列表作为值吗? 当我尝试它时,一个错误说那是因为MySQL语法中的一个错误
你的问题不清楚。
是否要将列表作为逗号分隔的文本字符串插入数据库中的单个列中?还是要将每个元素插入到单独的列中?两者皆有可能,但技术不同。
在一列中插入逗号分隔的列表:
conn.execute('INSERT INTO table (ColName) VALUES (?);', [','.join(list)])
插入到单独的列中:
params = ['?' for item in list] sql = 'INSERT INTO table (Col1, Col2. . .) VALUES (%s);' % ','.join(params) conn.execute(sql, list)
都假设你已经建立了一个连接名conn
其他一些建议:
尽量避免插入不列出要插入的列的名称和顺序的语句。这类语句会导致非常脆弱的代码;如果在表中添加、删除或移动列,它就会中断。
如果要将逗号分隔的列表插入单个字段,这通常违反了数据库设计的原则,应该使用一个单独的表每个记录一个值。
如果要插入到单独的字段中,并且这些字段的名称类似于Word1和Word2,那么这同样表明应该使用单独的表。
Word1
Word2
不要使用直接字符串替换来创建SQL语句。如果其中一个值是,例如o'clock,它将中断。它还为使用SQL注入技术的人的攻击打开了大门。
o'clock
可以使用json.dumps将列表转换为json并将json写入db。
json.dumps
例如:
insert table example_table(column_name) values(json.dumps(your_list))
你最初的问题的答案是:不,你不能插入这样的列表。
但是,通过一些调整,您可以使用%r并传入一个元组来使代码工作:
%r
variable_1 = "HELLO" variable_2 = "ADIOS" varlist = [variable_1, variable_2] print "INSERT INTO table VALUES %r;" % (tuple(varlist),)
不幸的是,这种类型的变量插入使代码容易受到SQL injection attacks攻击。
相反,我们建议使用Python's 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)
在SQLite3 docs开头的例子展示了如何使用问号传递参数,并解释了为什么它们是必要的(本质上,它确保了变量的正确引用)。
你的问题不清楚。
是否要将列表作为逗号分隔的文本字符串插入数据库中的单个列中?还是要将每个元素插入到单独的列中?两者皆有可能,但技术不同。
在一列中插入逗号分隔的列表:
插入到单独的列中:
都假设你已经建立了一个连接名conn
其他一些建议:
尽量避免插入不列出要插入的列的名称和顺序的语句。这类语句会导致非常脆弱的代码;如果在表中添加、删除或移动列,它就会中断。
如果要将逗号分隔的列表插入单个字段,这通常违反了数据库设计的原则,应该使用一个单独的表每个记录一个值。
如果要插入到单独的字段中,并且这些字段的名称类似于
Word1
和Word2
,那么这同样表明应该使用单独的表。不要使用直接字符串替换来创建SQL语句。如果其中一个值是,例如
o'clock
,它将中断。它还为使用SQL注入技术的人的攻击打开了大门。可以使用
json.dumps
将列表转换为json并将json写入db。例如:
你最初的问题的答案是:不,你不能插入这样的列表。
但是,通过一些调整,您可以使用
%r
并传入一个元组来使代码工作:不幸的是,这种类型的变量插入使代码容易受到SQL injection attacks攻击。
相反,我们建议使用Python's DB API并为要插入的数据构建带有多个问号的自定义查询字符串:
在SQLite3 docs开头的例子展示了如何使用问号传递参数,并解释了为什么它们是必要的(本质上,它确保了变量的正确引用)。
相关问题 更多 >
编程相关推荐