0

谁能告诉我在 Python 中执行动态 MySQL 查询的正确方法?

我想对 CREATE 和 INSERT 语句进行动态查询。我在这里提到了另一个帖子:

Python 中的 MySQL 动态查询语句

但它没有用。

这是我尝试的代码:

sql="create table %s (%%s, %%s, %%s ... )" % (tablename,''.join(fields)+' '.join(types))
cur.execute(sql)     

其中“field”是存储在列表中的字段名,“types”是存储在列表中的字段类型。

4

1 回答 1

0

MySQLdbPython 和DB 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进入表时,使用%s执行语句中的 转义字符串。

my_malicious_sql = input()
cur.execute('INSERT INTO %s VALUES (%%s)' % tablename, my_malicious_sql)

在这个例子中,第一个参数 toexecute()像这样展开,如果tablename == "foo"

cur.execute('INSERT INTO foo VALUES (%s)', my_malicious_sql)

然后,MySQLdb 库将正确地转义任何字符串my_malicious_sql以避免 SQL 注入错误并将文本插入到数据库表中。

于 2013-05-29T07:03:55.950 回答