mysql变量绑定python
mysql存储过程使用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 = t(':memory:')
c = conn.cursor()
_users = [('mother', 'red'),
('father', 'green'),
('me', 'blue')]
params = ('sister', 'yellow')
c.fetchone()
事实上,Python并不⽀持MySQL预编译语句,当然有可替代的⽅案,参见。
举例:
import MySQLdb
_users = [('mother', 'red'),
('father', 'green'),
('me', 'blue')]
conn = t(host = 'localhost',user ='root',passwd = '') cursor = conn.cursor()
cursor.close()
conn.close()
具体实现⽅案与paramstyle有关,参见。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论