Python中的MySQL动态查询

时间:2013-05-29 06:25:46

标签: python mysql dynamic

有人能告诉我在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'是存储在列表中的字段类型。

1 个答案:

答案 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注入错误并将文本插入数据库表。