python的execute
1. python 如何把变量的值传递给execute的sql中去
python 把变量的值传递给execute的sql中去的代码:
import pymysql
db = pymysql.connect(host="119.XX.XX.XX",
port=3306,
user="XXXXXXXX",
passwd="XXXXXXXXXXXXX",
db="XXXXXX",
charset='utf8')
# %s 占位符为需要传递的参数,切记不要加''双引号,要不然会报错
sql = "SELECT totalusercount * 1.4 FROM mm_project_uv_outdoor WHERE poiid = %s AND currenttime = %s"
cursor = db.cursor()
# 以下为传递多个参数的用法
cursor.execute(sql,['B00140N5CS','2019-04-23'])
# 传递单个参数时 cursor.execute(sql,'B00140N5CS')
print(cursor.fetchall())
db.close()
(1)python的execute扩展阅读:
函数
Python的函数支持递归、默认参数值、可变参数,但不支持函数重载。为了增强代码的可读性,可以在函数后书写“文档字符串”(Documentation Strings,或者简称docstrings),用于解释函数的作用、参数的类型与意义、返回值类型与取值范围等。可以使用内置函数help()打印出函数的使用帮助。比如:
>>> def randint(a, b):
... "Return random integer in range [a, b], including both end points."...
>>> help(randint)
Help on function randint in mole __main__:
randint(a, b)
Return random integer inrange[a, b], including both end points.
2. python连接MySQL数据库问题 cursor( ) 、execute()和fetchall( )方法的作用
cucursor()方法的作用?获取操作游标
- execute方法的作用?执行SQL,括号里的是sql语句
- fetchall()方法滴作用?返回查询到的所有记录
3. python fetchone 取出的数据是什么类型
举例,首先看了pymysql里面的cursor类,关于execute、fetchone和fetchall定义如下:
#调用self._query方法进行查询
def execute(self, query, args=None):
"""Execute a query
:param str query: Query to execute.
:param args: parameters used with query. (optional)
:type args: tuple, list or dict
:return: Number of affected rows
:rtype: int
If args is a list or tuple, %s can be used as a placeholder in the query.
If args is a dict, %(name)s can be used as a placeholder in the query.
"""
while self.nextset():
pass
query = self.mogrify(query, args)
result = self._query(query)
self._executed = query
return result
#调用_do_get_result获取查询结果
def _query(self, q):
conn = self._get_db()
self._last_executed = q
self._clear_result()
conn.query(q)
self._do_get_result()
return self.rowcount
#这里获取结果
def _do_get_result(self):
conn = self._get_db()
self._result = result = conn._result
self.rowcount = result.affected_rows
self.description = result.description
self.lastrowid = result.insert_id
self._rows = result.rows
self._warnings_handled = False
if not self._defer_warnings:
self._show_warnings()
其实看到这里代码逻辑已经很清楚了,在调用cursor.execute执行SQL的时候,就将MySQL查询的结果放到result这个变量里了,也就是说结果集放到了客户端的内存变量里,那么获取数据的方式也就是从这个内存变量里去获取数据,只是获取的行为有所不同而已了。
def fetchone(self):
"""Fetch the next row"""
self._check_executed()
if self._rows is None or self.rownumber >= len(self._rows):
return None
result = self._rows[self.rownumber]
self.rownumber += 1
return result
def fetchmany(self, size=None):
"""Fetch several rows"""
self._check_executed()
if self._rows is None:
return ()
end = self.rownumber + (size or self.arraysize)
result = self._rows[self.rownumber:end]
self.rownumber = min(end, len(self._rows))
return result
def fetchall(self):
"""Fetch all the rows"""
self._check_executed()
if self._rows is None:
return ()
if self.rownumber:
result = self._rows[self.rownumber:]
else:
result = self._rows
self.rownumber = len(self._rows)
return result
口说无凭,我们直接通过Wireshark抓包来证明一下,首先我在本地执行脚本如下,然后我监听本地的网卡流量
import pymysql
conn = pymysql.connect(host='xxx', port=3306,
user='xucl', password='xuclxucl', database='xucl')
cursor = conn.cursor()
cursor.execute("select * from t")
注意,我这里并没有执行fetch操作,如果监听到的包里面包含了结果,那么就证明我们前面的分析是正确的,话不多说开始实验,Wireshark抓包如下:
果然跟我们之前的预测是一致的,即使没有进行fetch操作,MySQL也将结果集发送到客户端了。另外关于结果集发送,可以参考我另外一篇文章:《由一个抓瞎的SQL引申出去》
结论:
客户端执行SQL的时候,MySQL一次性将结果集发送给了客户端
客户端接收到结果集以后存储本地内存变量中
fetch结果只是从这个本地变量中获取,fetchone/fetchmany/fetchall只是获取行为的不通,因此对于MySQL来说并没有什么不通的。
4. python连接MySQL数据库问题 cursor( ) 、execute()和fetc
MySQLdb.connect是python 连接MySQL数据库的方法,在Python中 import MySQLdb即可使用,至于connect中的参数很简单:x0dx0ahost:MySQL服务器名x0dx0auser:数据库使用者x0dx0apassword:用户登录密码x0dx0adb:操作的数据库名x0dx0acharset:使用的字符集(一般是gb2312)x0dx0acursor = db.cursor() 其实就是用来获得python执行Mysql命令的方法,也就是x0dx0a我们所说的操作游标x0dx0a下面cursor.execute则是真正执行MySQL语句,即查询TABLE_PARAMS表的数据。x0dx0a至于fetchall()则是接收全部的返回结果行 row就是在python中定义的一个变量,用来接收返回结果行的每行数据。同样后面的r也是一个变量,用来接收row中的每个字符,如果写成C的形式就更好理解了x0dx0afor(string row = '' row<= cursor.fetchall(): row++)x0dx0a for(char r = '' r<= row; r++)x0dx0aprintf("%c", r);x0dx0a大致就是这么个意思!