有人能告诉我在Python中执行动态MySQL查询的正确方法吗?
我想对CREATE和INSERT语句进行动态查询。我在这里提到了另一篇文章:
MySQL Dynamic Query Statement in Python
但它不起作用。
这是我尝试过的代码:
sql="create table %s (%%s, %%s, %%s ... )" % (tablename,''.join(fields)+' '.join(types))
cur.execute(sql)
其中'field'是存储在列表中的字段名,'types'是存储在列表中的字段类型。
答案 0 :(得分:0)
Python和MySQLdb
数据库API使用%s
来表示替换可能会令人困惑。对于DB API,它主要用于避免SQL注入攻击。在cursor.execute()
语句中,只有在需要字符串替换的%s
时才有意义。
例如
您希望执行以下sql:
CREATE TABLE foo (myfield INTEGER);
不
CREATE TABLE 'foo' ('myfield' INTEGER);
以下内容可能适用:
field1_name_and_type = 'myfield VARCHAR(100)'
sql="create table %s (%s)" % (tablename, field1_name_and_type)
cur.execute(sql)
然后,当你想要INSERT
进入表时,使用execute语句中的%s
来转义字符串。
my_malicious_sql = input()
cur.execute('INSERT INTO %s VALUES (%%s)' % tablename, my_malicious_sql)
在此示例中,execute()
的第一个参数如下所示展开,如果tablename == "foo"
:
cur.execute('INSERT INTO foo VALUES (%s)', my_malicious_sql)
然后,MySQLdb库将正确转义my_malicious_sql
中的任何字符串,以避免SQL注入错误并将文本插入数据库表。