python - Python 中的 MySQL 动态查询

标签 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”是存储在列表中的字段类型。

最佳答案

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/

相关文章:

jquery 自动完成动态生成的文本框

c - 两个程序链接到动态链接库

c# - 在 C# 中指定泛型类型参数时如何使用 `dynamic`?

python - Django settings.py 未更新

python - 查找 XPath 段落(以下兄弟?)

mysql - 如何在 laravel 5.0 中使用 outer full join?

mysql - 使用 5 个左连接提高 MySQL 查询速度

python - 反向关系搜索 Django 管理界面

python - argparse - 为什么代码在没有被调用的情况下被执行?

mysql - 最有效的 mysql 查询为搜索列表中的每个结果检索多个类别