python3.6 mysql mysql 查询结果不是最新

君,已阅读到文档的结尾了呢~~
w3school SQL教程 飞龙整理
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
w3school SQL教程 飞龙整理
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口跟老齐学Python之使用Python查询更新数据库
投稿:hebedich
字体:[ ] 类型:转载 时间:
前面我们讲述了使用python操作数据库,今天我们来更进一步,介绍下python查询、更新数据库的相关操作。有需要的小伙伴自己参考下吧。
回顾一下已有的战果:(1)连接数据库;(2)建立指针;(3)通过指针插入记录;(4)提交将插入结果保存到数据库。在交互模式中,先温故,再知新。
&&& #导入模块
&&& import MySQLdb
&&& #连接数据库
&&& conn = MySQLdb.connect(host="localhost",user="root",passwd="123123",db="qiwsirtest",port=3036,charset="utf8")
&&& #建立指针
&&& cur = conn.cursor()
&&& #插入记录
&&& cur.execute("insert into users (username,password,email) values (%s,%s,%s)",("老齐","9988",""))
&&& #提交保存
如果看官跟我似的,有点强迫症,总是想我得看到数据中有了,才放芳心呀。那就在进入到数据库,看看。
mysql& select *
&&& +----+----------+----------+------------------+
&&& | id | username | password | email&&&&&&&&&&& |
&&& +----+----------+----------+------------------+
&&& |& 1 | qiwsir&& | 123123&& |
&&& |& 2 | python&& | 123456&& |
&&& |& 3 | google&& | 111222&& | &&&&& |
&&& |& 4 | facebook | 222333&& | &&&&& |
&&& |& 5 | github&& | 333444&& | &&&&& |
&&& |& 6 | docker&& | 444555&& | &&&&& |
&&& |& 7 | 老齐&&&& | 9988&&&& |
&&& +----+----------+----------+------------------+
&&& 7 rows in set (0.00 sec)
刚才温故的时候,插入的那条记录也赫然在目。不过这里特别提醒看官,我在前面建立这个数据库和数据表的时候,就已经设定好了字符编码为utf8,所以,在现在看到的查询结果中,可以显示汉字。否则,就看到的是一堆你不懂的码子了。如果看官遇到,请不要慌张,只需要修改字符编码即可。怎么改?请google。网上很多。
温故结束,开始知新。
在前面操作的基础上,如果要从数据库中查询数据,当然也可以用指针来操作了。
&&& cur.execute("select * from users")&&&
这说明从users表汇总查询出来了7条记录。但是,这似乎有点不友好,告诉我7条记录查出来了,但是在哪里呢,看前面在'mysql&'下操作查询命令的时候,一下就把7条记录列出来了。怎么显示python在这里的查询结果呢?
原来,在指针实例中,还要用这样的方法,才能实现上述想法:
fetchall(self):接收全部的返回结果行.
fetchmany(size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
fetchone():返回一条结果行.
scroll(value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果mode='absolute',则表示从结果集的第一行移动value条.
按照这些规则,尝试:
&&& cur.execute("select * from users")&&&
&&& lines = cur.fetchall()
到这里,还没有看到什么,其实已经将查询到的记录(把他们看做对象)赋值给变量lines了。如果要把它们显示出来,就要用到曾经学习过的循环语句了。
&&& for line in lines:
...&&&& print line
(1L, u'qiwsir', u'123123', )
(2L, u'python', u'123456', )
(3L, u'google', u'111222', )
(4L, u'facebook', u'222333', )
(5L, u'github', u'333444', )
(6L, u'docker', u'444555', )
(7L, u'\u', u'9988', )
很好。果然是逐条显示出来了。列位注意,第七条中的u'\u',这里是汉字,只不过由于我的shell不能显示罢了,不必惊慌,不必搭理它。
只想查出第一条,可以吗?当然可以!看下面的:
&&& cur.execute("select * from users where id=1")
&&& line_first = cur.fetchone()&&&& #只返回一条
&&& print line_first
(1L, u'qiwsir', u'123123', )
为了对上述过程了解深入,做下面实验:
&&& cur.execute("select * from users")
&&& print cur.fetchall()
((1L, u'qiwsir', u'123123', ), (2L, u'python', u'123456', ), (3L, u'google', u'111222', ), (4L, u'facebook', u'222333', ), (5L, u'github', u'333444', ), (6L, u'docker', u'444555', ), (7L, u'\u', u'9988', ))
原来,用cur.execute()从数据库查询出来的东西,被“保存在了cur所能找到的某个地方”,要找出这些被保存的东西,需要用cur.fetchall()(或者fechone等),并且找出来之后,做为对象存在。从上面的实验探讨发现,被保存的对象是一个tuple中,里面的每个元素,都是一个一个的tuple。因此,用for循环就可以一个一个拿出来了。
看官是否理解其内涵了?
接着看,还有神奇的呢。
接着上面的操作,再打印一遍
&&& print cur.fetchall()
晕了!怎么什么是空?不是说做为对象已经存在了内存中了吗?难道这个内存中的对象是一次有效吗?
不要着急。
通过指针找出来的对象,在读取的时候有一个特点,就是那个指针会移动。在第一次操作了print cur.fetchall()后,因为是将所有的都打印出来,指针就要从第一条移动到最后一条。当print结束之后,指针已经在最后一条的后面了。接下来如果再次打印,就空了,最后一条后面没有东西了。
下面还要实验,检验上面所说:
&&& cur.execute('select * from users')
&&& print cur.fetchone()
(1L, u'qiwsir', u'123123', )
&&& print cur.fetchone()
(2L, u'python', u'123456', )
&&& print cur.fetchone()
(3L, u'google', u'111222', )
这次我不一次全部打印出来了,而是一次打印一条,看官可以从结果中看出来,果然那个指针在一条一条向下移动呢。注意,我在这次实验中,是重新运行了查询语句。
那么,既然在操作存储在内存中的对象时候,指针会移动,能不能让指针向上移动,或者移动到指定位置呢?这就是那个scroll()
&&& cur.scroll(1)
&&& print cur.fetchone()
(5L, u'github', u'333444', )
&&& cur.scroll(-2)
&&& print cur.fetchone()
(4L, u'facebook', u'222333', )
果然,这个函数能够移动指针,不过请仔细观察,上面的方式是让指针相对与当前位置向上或者向下移动。即:
cur.scroll(n),或者,cur.scroll(n,"relative"):意思是相对当前位置向上或者向下移动,n为正数,表示向下(向前),n为负数,表示向上(向后)
还有一种方式,可以实现“绝对”移动,不是“相对”移动:增加一个参数"absolute"
特别提醒看官注意的是,在python中,序列对象是的顺序是从0开始的。
&&& cur.scroll(2,"absolute")&&& #回到序号是2,但指向第三条
&&& print cur.fetchone()&&&&&&& #打印,果然是
(3L, u'google', u'111222', )
&&& cur.scroll(1,"absolute")
&&& print cur.fetchone()
(2L, u'python', u'123456', )
&&& cur.scroll(0,"absolute")&&& #回到序号是0,即指向tuple的第一条
&&& print cur.fetchone()
(1L, u'qiwsir', u'123123', )
至此,已经熟悉了cur.fetchall()和cur.fetchone()以及cur.scroll()几个方法,还有另外一个,接这上边的操作,也就是指针在序号是1的位置,指向了tuple的第二条
&&& cur.fetchmany(3)
((2L, u'python', u'123456', ), (3L, u'google', u'111222', ), (4L, u'facebook', u'222333', ))
上面这个操作,就是实现了从当前位置(指针指向tuple的序号为1的位置,即第二条记录)开始,含当前位置,向下列出3条记录。
读取数据,好像有点啰嗦呀。细细琢磨,还是有道理的。你觉得呢?
不过,python总是能够为我们着想的,它的指针提供了一个参数,可以实现将读取到的数据变成字典形式,这样就提供了另外一种读取方式了。
&&& cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
&&& cur.execute("select * from users")
&&& cur.fetchall()
({'username': u'qiwsir', 'password': u'123123', 'id': 1L, 'email': }, {'username': u'mypython', 'password': u'123456', 'id': 2L, 'email': }, {'username': u'google', 'password': u'111222', 'id': 3L, 'email': }, {'username': u'facebook', 'password': u'222333', 'id': 4L, 'email': }, {'username': u'github', 'password': u'333444', 'id': 5L, 'email': }, {'username': u'docker', 'password': u'444555', 'id': 6L, 'email': }, {'username': u'\u', 'password': u'9988', 'id': 7L, 'email': })&&&
这样,在元组里面的元素就是一个一个字典。可以这样来操作这个对象:
&&& cur.scroll(0,"absolute")
&&& for line in cur.fetchall():
...&&&& print line["username"]
根据字典对象的特点来读取了“键-值”。
经过前面的操作,这个就比较简单了,不过需要提醒的是,如果更新完毕,和插入数据一样,都需要commit()来提交保存。
&&& cur.execute("update users set username=%s where id=2",("mypython"))
&&& cur.execute("select * from users where id=2")
&&& cur.fetchone()
(2L, u'mypython', u'123456', )
从操作中看出来了,已经将数据库中第二条的用户名修改为mypython了,用的就是update语句。
不过,要真的实现在数据库中更新,还要运行:
这就大事完吉了。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具<meta property="og:image" content="
Python操纵MySQL根基情形搭建及增编削查实现
这篇文章将教育读者行使Python操纵MySQL数据库。在PHP和Python之间博主更倾向于Python,尔靠山开拓免不了要操纵数据库,以是就有了这篇文章。
【51CTO勾当】8.26 带你与清华大学、搜狗、京东大咖们一路切磋基于算法的IT运维实践
写作缘故起因:这篇文章将教育读者行使操纵MySQL数据库。在PHP和之间博主更倾向于Python,尔靠山开拓免不了要操纵数据库,以是就有了这篇文章。
安装Python
鉴于上一篇关于Python的文章已经有关于Python安装的先容了,这里就不花文字多说了。
MySQL是一个相关型数据库打点体系,,由瑞典MySQL AB
公司开拓,今朝属于Oracle旗下产物。MySQL是一款优越的开源产物,正是因为其开源性使其逐渐成为现今贸易数据库的主流选择之一。
详细安装流程(Win版)
因为博主今朝只在Win平台测试,以是这里只先容Win版的安装流程。
起首下载-5.6.33-winx64( 下载地点
),5.7以上版本在安装的进程中会呈现一些题目,以是本人选择了5.6版本。安装的进程一向下一步就行;
然后设置体系情形变量。找到&体系-高级体系配置-情形变量&,在Path的最后加上数据库内的bin文件夹目次如&;D:\mysql-5.6.33-winx64\bin&(留意必然要加分号);
到根目次下打开my-default.ini文件,将&# basedir = && # datadir = &&&修改为&basedir =
D:\mysql-5.6.33-winx64 datadir = D:\mysql-5.6.33-winx64\data&;
打开cmd(必然要打点员权限!)转到&D:\mysql-5.6.33-winx64\bin&目次,输入&mysqld
-install&。比及呈现&Service successfully installed.&之后就继承输入&net start
mysql&。这样mysql就启动了。
行使pymysql包
下面就是正是行使Python来操纵mysql的第一步了。打开cmd,直接输入pip install
PyMySql,等它安装完毕就OK了,就是这么简朴。
操作Mysql WorkBench可视化数据库
对付数据库,假如用呼吁行的话偶然也许会较量贫困,这时可以思量行使GUI界面取代CLI。官方提供了MySql WorkBench( 点击下载
)。行使WorkBench我们可以等闲地查察当地数据库的一些状态、数据库的操纵等等,详细行使不多说了,这里只说一下新建数据库和数据表。点击图标栏第四个图标(create
a new schema in the connected
server),配置好相干参数就可以建设数据库。在Schema器材栏中,选择你要添加表的数据库,右键Tables选择&Create
Table&,写好字段和数据范例,即可完成数据表的建设。
实现根基的数据库的增编削查
下面开始写代码。
详细代码如下:
import&pymysql def&connDB(): #毗连数据库 conn=pymysql.connect(host='localhost',user='root',passwd='',db='first') cur=conn.cursor() return&(conn,cur) def&exeUpdate(conn,cur,sql): #更新语句,可执行Update,Insert语句 sta=cur.execute(sql) conn.commit() return&(sta) def&exeDelete(conn,cur,IDs): #删除语句,可批量删除 for&eachID&in&IDs.split('&'): sta=cur.execute('delete&from&students&where&Id=%d'%int(eachID)) conn.commit() return&(sta) def&exeQuery(cur,sql):&&#查询语句&&cur.execute(sql) result&=&cur.fetchone() return&(result) def&connClose(conn,cur): #封锁全部毗连 cur.close() conn.close() conn&=&connDB()[0] cur&=&connDB()[1] exeUpdate(conn,cur,&INSERT&INTO&first_note&(idfirst_note,&note_title&,&note_content&)&VALUES&(0,'Title','This&is&the&content');&) print(exeQuery(cur,&SELECT&note_title&,note_content&FROM&first_&)) connClose()&
这里有几个处所声名一下:
我们通过conn=pymysql.connect(host='localhost',user='root',passwd='',db='first')&要领获取一个connection工具。
(责任编辑:SKY)
------分隔线----------------------------
之前看Spark的评价,险些同等暗示,Spark是小数据集上处理赏罚伟大迭代的交互体系,并...
新的空间维度与陶醉式体验所带来的攻击是亘古未有的。要在三维天下傍边打造令人舒服的...
本文为出门问问&Ticwear CTO雷欣博士从Coding、开拓情形以及团队相助等角度切入,分享...
Byterun 是一个用 Python 实现的 Python 表明器。跟着我对 Byterun 的开拓,我惊喜地...
跟着互联网和物联网的快速成长和普及应用,天下处于各类数据指数式增添的情形中,进入...
“开源”模式带来的甜头许多,个中最吸引人的就是可以辅佐企业低落本钱。其它,开源模...
增值电信业务经营许可证:
编辑热线:400-601-7885
深圳市九五时代科技有限公司 时代站长网 版权所有.Python的MySQLdb模块是Python连接MySQL的一个模块,
使用MySQLdb 模块获取mysql中的记录,默认查询结果返回是tuple类型,只能通过0,1等索引下标访问数据。
默认的连接方式:
conn = MySQLdb.
Python的MySQLdb模块是Python连接MySQL的一个模块,
使用MySQLdb 模块获取mysql中的记录,默认查询结果返回是tuple类型,只能通过0,1等索引下标访问数据。
默认的连接方式:
conn = MySQLdb.connect(host=dbconn.DB_HOST,port=int(dbconn.DB_PORT),user=dbconn.DB_USER,passwd=dbconn.DB_PASS, charset='utf8')
root@alsdb_admin1b # python dict.py
the type of res1 is :
(u'Com_delete', u'6491620')
----------------------------------------
import MySQLdb.cursors
在conn 中加上 cursorclass = MySQLdb.cursors.DictCursor
conn = MySQLdb.connect(host=dbconn.DB_HOST,port=int(dbconn.DB_PORT),user=dbconn.DB_USER,passwd=dbconn.DB_PASS, charset='utf8',cursorclass = MySQLdb.cursors.DictCursor)
返回的结果集仍然是 tuple 类型但是 结果机里面的值已经变为词典类型了,但是这样并不能解决问题
the type of res2 is :
{'Value': u'6491620', 'Variable_name': u'Com_delete'}
----------------------------------------
使用dict(result) 将结果集转换为词典,得到如下结果:
the type of mystat2 is :
{u'Com_delete': u'6491620'}
这样可以直接使用mystat2['Com_delete'] 来调用对应的vlaue
dict.py的代码:
#!/usr/bin/env python
#coding=utf-8
import time
import sys
import MySQLdb
import dbconn
import MySQLdb.cursors
def now() :
#return str(' 00:00:00')
return str( time.strftime( '%Y-%m-%d %H:%M:%S' , time.localtime() ) )
def log( qps,tps , logs ) :
f = file( logs , 'a' , 0 )
f.write( now() + '
' + str(qps) +'
'+ str(tps) + '\n' )
def main() :
conn = MySQLdb.connect(host=dbconn.DB_HOST,port=int(dbconn.DB_PORT),user=dbconn.DB_USER,passwd=dbconn.DB_PASS, charset='utf8')
MySQLdb.ERROR,e:
print "Error %d:%s"%(e.args[0],e.args[1])
conn.autocommit(True)
cursor=conn.cursor()
mystat1={}
sql = "show global status where Variable_name in ('Com_delete');"
cursor.execute(sql)
res1 = cursor.fetchall()
for row in res1:
print "the type of res1 is : ", type(row)
conn.close()
print "----------------------------------------\n"
conn = MySQLdb.connect(host=dbconn.DB_HOST,port=int(dbconn.DB_PORT),user=dbconn.DB_USER,passwd=dbconn.DB_PASS, charset='utf8',cursorclass = MySQLdb.cursors.DictCursor)
MySQLdb.ERROR,e:
print "Error %d:%s"%(e.args[0],e.args[1])
conn.autocommit(True)
cursor=conn.cursor()
mystat2={}
cursor.execute(sql)
res2 = cursor.fetchall()
#mystat2=dict(res2)
for row in res2:
print "the type of res2 is : ", type(res2)
conn.close()
print "----------------------------------------\n"
conn = MySQLdb.connect(host=dbconn.DB_HOST,port=int(dbconn.DB_PORT),user=dbconn.DB_USER,passwd=dbconn.DB_PASS, charset='utf8')
MySQLdb.ERROR,e:
print "Error %d:%s"%(e.args[0],e.args[1])
conn.autocommit(True)
cursor=conn.cursor()
mystat2={}
cursor.execute(sql)
res2 = cursor.fetchall()
mystat2=dict(res2)
print "the type of mystat2 is : ", type(mystat2)
print mystat2
conn.close()
if __name__ == '__main__':
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】数据库技术天团集体亮相,分享一线生产实践经验,告诉你踩过的坑、走过的路,都是老司机,靠谱!干货分享,不可错过!&&
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...
是为多媒体数据提供的转码计算服务。它以经济、弹性和高可扩展的音视频转换方法,将多媒体数据转码成适合在PC、TV以...
为企业和开发者提供稳定、安全、智能的把网站域名或应用资源转换为计算机用于互连的数字 IP地址,从而将最终用户的访...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017杭州云栖大会火热抢票
Loading...Posts - 277,
Articles - 1,
Comments - 2822
大人不华,君子务实。
21:16 by 虫师, ... 阅读,
  之前写过一篇 Python使用MySQL数据库的博客,主要使用的是Python2和MySQLdb驱动。
  然而,2016年开始,我从Python2切换到了Python3,Python2已经基本不再使用,MySQLdb驱动从2014年1月停止了维护。所以,打算重新再来写这篇博客。
Python2 ---& Python3
MySQLdb --& PyMySQL
一,安装PyMySQL
Python是编程语言,MySQL是数据库,它们是两种不同的技术;要想使Python操作MySQL数据库需要使用驱动。这里选用PyMySQL驱动。下载地址:
当然,最简单的安装方式还是使用pip命令。
& pip install&&PyMySQL
把install 换成show命令,查看PyMySQL安装是否成功。
二,创建MySQL表
执行下面的SQL语句,创建一张users 表。
CREATE TABLE `users` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`email` VARCHAR(255) COLLATE utf8_bin NOT NULL,
`password` VARCHAR(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
AUTO_INCREMENT=1 ;
三,Python操作MySQL
接下来才是重点,Python操作MySQL数据库。
4.1插入数据:
import pymysql.cursors
# 连接MySQL数据库
connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='198876', db='guest',
charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
# 通过cursor创建游标
cursor = connection.cursor()
# 创建sql 语句,并执行
sql = "INSERT INTO `users` (`email`, `password`) VALUES ('', '123456')"
cursor.execute(sql)
  不管你使用的是什么工具或库,连接数据库这一步必不可少。host为数据库的主机IP地址,port为MySQL的默认端口号,user为数据的用户名,password为数据库的登录密码,db为数据库的名称。
  cursor()方法创建数据库游标。
  execute()方法执行SQL语句。
  commit()将数据库的操作真正的提交到数据。
4.2. 查询数据
import pymysql.cursors
# 连接MySQL数据库
connection = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='198876', db='guest', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
# 通过cursor创建游标
cursor = connection.cursor()
# 执行数据查询
sql = "SELECT `id`, `password` FROM `users` WHERE `email`=''"
cursor.execute(sql)
#查询数据库单条数据
result = cursor.fetchone()
print(result)
print("-----------华丽分割线------------")
# 执行数据查询
sql = "SELECT `id`, `password` FROM `users`"
cursor.execute(sql)
#查询数据库多条数据
result = cursor.fetchall()
for data in result:
print(data)
# 关闭数据连接
connection.close()
&  接下来的操作就是数据库的查询了。
  fetchone() 用于查询单条数据。
  fetchall() 用于查询多条数据。
  close() 最后不要忘记了关闭数据连接。
  运行结果:
{'password': '123456', 'id': 1}
-----------华丽分割线------------
{'password': '123456', 'id': 1}
{'password': '654321', 'id': 2}

我要回帖

更多关于 python3.6 mysql 的文章

 

随机推荐