我是python的新手并编写一个脚本来读取json文件,进行一些处理,并生成最终写入sql文件的SQL语句。我在mysql.connector
上使用python 3.6
创建连接。
从该连接对象,我需要引用绑定到SQL的参数。我没有从python执行SQL,否则python本身就会处理它。
另外,我没有直接使用单/双引号,因为我的值可能包含这些引号,而sql会中断。此外,还有许多字符需要引用,因此在更换一个字符(比如单引号)后无法确定。
示例代码:
import mysql.connector
con = mysql.connector.connect(user=user, password=pwd, database=database, host=host)
sql = "INSERT INTO customer_data VALUES "
values = "(default, %s, %s, %s);" % (
cust_record["name"],
cust_record["address"],
comment["date"]
)
fh.write("%s %s\n" % (sql, values))
它在创建插入语句时写入字符串,我避免使用硬编码的单引号。
我也在控制台上尝试过这个测试:
name = 'kam\al'
str = ("my name is %s" % name)
con.converter.escape(str)
它提供:'my name is kam\x07l'
,不引用名称字符串。
Perl中的相同内容可以通过perl DBI的quote方法实现。
答案 0 :(得分:0)
<强>更新强>
如果需要,可以使用convert_to_mysql()
,并以不同的方式构建连接。这是一个例子(Python 3.6):
import _mysql_connector
ccnx.connect(user='abc', database='xyz', password='def')
params = ('sdgs\adsgsdg', 'sdgs^&%"', "sdgsdg'")
print(ccnx.convert_to_mysql(*params))
将输出:
(b"'sdgs\x07dsgsdg'", b'\'sdgs^&%\\"\'', b"'sdgsdg\\''")
他们已被引用并转义。请注意它们是字节(python 3),因此您可能需要将它们转换为str
(在您的python版本上进行删除。
请参阅: _mysql_connector.MySQL.convert_to_mysql() Method
旧答案
不要以这种方式构造查询,您可以自己开放SQL注入和其他问题。
使用准备好的陈述,让司机为你做引用,例如:
stmt = "INSERT INTO names (name) VALUES (%s)"
name = "Some name' who cares"
cursor.execute(stmt, (name,))
有关详细信息,请参阅: Inserting Data Using Connector/Python