mysql变量绑定 python

mysql变量绑定 python


预编译语句

在数据库管理系统中,预编译语句或者叫参数化语句是用来高效重复执行相同或相似语句的,这在SQL语句中有很典型的使用,比如说查询或更新语句,预编译语句使用模板的形式,每次执行语句的时候就会替换相应的值。
典型的使用预编译语句的流程是这样的:

  • 预编译:应用程序创建语句模板并发送给数据库管理系统(DBMS),特定的值是未确定的,叫做参数、占位符或绑定变量(下面’?’标记的):INSERT INTO PRODUCT (name, price) VALUES (?, ?)
  • 数据库管理系统对语句模板进行分析、编译并执行查询优化,然后储存结果但不执行。
  • 执行:之后应用程序为参数提供(绑定)值,接着DBMS执行语句(可能返回一个结果),应用程序可以用不同的值执行语句任意次。在上面的例子中,’Bread’被提供给第一个参数,’1.00’给第二个。

和直接执行SQL语句相比,预编译语句有两个主要的优势:
- 虽然语句要执行很多次,但编译和优化语句的中间过程只有一次,不是所有的优化都能在语句编译后完成,有两个原因:最好的方案依赖于参数特定的值,最好的方案可能会随着表和索引的变化而变化。
- 预编译语句可有效抵御SQL注入,因为使用另一种协议传给参数的值不一定要被正确escape,如果原始的语句模板不是源于外部输入,SQL注入不会发生。

另一方面,如果一个查询只被执行一次,服务器端的预编译语句可能要慢点因为服务器额外的round-trip,预编译语句实现方面的限制也可能弱化性能,例如,一些版本的MYSQL不会缓存预编译查询语句的结果。存储过程(stored procedure)同样是预编译、存储在服务器上等待下一次执行的,它和预编译语句有相似的优点,但是预编译语句不像存储过程那样使用过程型语言来写而且不能使用、修改变量或使用流程控制语句,而是依赖于声明型数据库查询语言,正是因为其足够简单和客户端的模拟,预编译语句更适合不同供应商的产品。

Python DB-API

SQLite例子,paramstyle为qmark:

import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()

_users = [('mother', 'red'),
    ('father', 'green'),
    ('me', 'blue')]
c.executemany('INSERT INTO users VALUES (?,?)', _users)

params = ('sister', 'yellow')
c.execute('SELECT * FROM users WHERE username=? AND room=?', params)
c.fetchone()

事实上,Python并不支持MySQL预编译语句,当然有可替代的方案,参见Does Python support MySQL prepared statements?
举例:

import MySQLdb

_users = [('mother', 'red'),
    ('father', 'green'),
    ('me', 'blue')]

conn = MySQLdb.connect(host = 'localhost',user ='root',passwd = '')
cursor = conn.cursor()
cursor.executemany('INSERT INTO test VALUES (%s,%s)', _users)
conn.commit()
cursor.close()
conn.close()

具体实现方案与paramstyle有关,参见PEP-249

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值