zoukankan      html  css  js  c++  java
  • Python连接MySQL数据库执行sql语句时的参数问题

    由于工作需要,今天写了一个Python小脚本,其中需要连接MySQL数据库,在执行sql命令时需要传递参数,结果出问题了。在网上查了一下,发现有以下几种方式传递参数:

    一.直接把sql查询语句完整写入字符串

    1     try:
    2         connection = MySQLdb.connect(user="secsel",passwd="secsel@55",host="192.168.138.55",db="anbench")
    3     except:
    4         print "Could not connect to MySQL server."
    5         exit( 0 )
    6 
    7     cursor = connection.cursor()
    8     cursor.execute( "SELECT a.id,a.md5,CONCAT(b.`from_name`,'/',b.`suffix`,'/',a.`md5`) FROM apk_sec a,apk_from b WHERE a.`apk_from_id`=b.`id` AND a.md5 = %s", apk_md5)    

    二.使用参数替代

    city = 'beijing'
    
    cur.execute(“SELECT * FROM %s WHERE city = %s”, city)

    #注意此处的占位符统统是%s字符串类型,不再区分字符串,数字或者其他类型。另外%s不能加引号,如”%s”这是错误的写法。我就是加引号出错了。

    变量替代的时候还有一种写法:

    cur.execute(“SELECT * FROM %s WHERE city = %s” %city)

    前面代码使用了逗号,这里使用了百分号%。两者区别在于变量的解释方式。使用逗号,变量是作为execute的参数传入的,由MySQLdb的内置方法把变量解释成合适的内容。使用百分号%则是用Python编译器对%s执行相应的替代,这种方法是有漏洞的,有些时候(比如包含某些特殊字符的时候)不能正常解析,甚至会有注入漏洞。一般情况下都要把变量作为execute的参数传入。

    3.使用字典dict类型传递变量

    1 sql = “INSERT INTO user VALUES(%(username)s, %(password)s, %(email)s)”
    2 
    3 value = {“username”:zhangsan,
    4 
    5 “password”:123456,
    6 
    7 “email”:123456@ouvps.com}
    8 
    9 cur.execute(sql, value)

    上面这种方法适合字段比较多的时候,变量顺序不会错。

    附上我写的脚本代码相关部分:

     1 def get_apkpath(apk_md5):
     2     try:
     3         connection = MySQLdb.connect(user="***",passwd="***",host="192.168.***.***",db="***")
     4     except:
     5         print "Could not connect to MySQL server."
     6         exit( 0 )
     7 
     8     cursor = connection.cursor()
     9     cursor.execute( "SELECT a.id,a.md5,CONCAT(b.`from_name`,'/',b.`suffix`,'/',a.`md5`) FROM apk_sec a,apk_from b WHERE a.`apk_from_id`=b.`id` AND a.md5 = %s", apk_md5)  #注意不要加引号
    10     print "Rows selected:", cursor.rowcount
    11 
    12     for row in cursor.fetchall():
    13         print "note : ", row[0], row[1], row[2]        
    14     cursor.close()
    15     return row[2]
  • 相关阅读:
    第九届蓝桥杯B组决赛-调手表
    第九届蓝桥杯B组决赛-搭积木
    洛谷P2680(树上差分+二分)
    线段树+扫描线+离散化
    hdu3911(线段树区间异或+区间和并+查询最区间大连续1的个数)
    线段树与位运算
    计蒜客Distance on the tree(主席树+LCA)
    洛谷P4742(tarjan缩点+拓扑DP)
    出题人的手环
    SP263 PERIOD
  • 原文地址:https://www.cnblogs.com/goodhacker/p/3257882.html
Copyright © 2011-2022 走看看