谁能告诉我在 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”是存储在列表中的字段类型。
最佳答案
Python 和 MySQLdb
DB API 都使用 %s
来表示替换,这可能会令人困惑。对于DB API来说,主要是用来避免SQL注入(inject)攻击。在 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)
在此示例中,execute()
的第一个参数将像这样展开,如果 tablename == "foo"
:
cur.execute('INSERT INTO foo VALUES (%s)', my_malicious_sql)
然后,MySQLdb 库将正确转义 my_malicious_sql
中的任何字符串以避免 SQL 注入(inject)错误,并将文本插入数据库表中。
关于python - Python 中的 MySQL 动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16806889/