一起来学习 PyMysql 吧!

Python操纵数据库(MySQL)


一、写在最前面

今天学习了PyMysql,总结了一下使用方法(流程):

  1. 建立连接connection
  2. 创建连接对象cursor
  3. 通过cursor.execute(str)方法执行mysql语句
  4. 处理事务:无异常connection.commit()向数据库提交修改;发生异常则调用connection.rollback()事务回滚
  5. cursor.fecthall()获取上个最近的cursor.execute(str)所有返回信息
  6. connection.close()关闭连接

TODO:有一个问题一直不知道什么情况,我对数据库表进行修改不用进行commit就可以修改成功。现在可能知道的情报,可能是因为我用root身份登录的权限较大不用commit,回头得好好研究。(虽然说TODO是程序员最大的谎言233)

我是跟着w3cschool的基础教程进行学习的,当然也看了看github上pymysql的官方文档(以下一段内容为无关部分)

这里有个小插曲,我看到README的格式是.rst(以前从没见过,计算机新人一枚)于是把官方文档整个下载下来,发现.rst格式用普通记事本打不开,于是上网了解了一下,发现它和markdown很像,rst是python用以书写文档的工具,为什么要有以及怎样使用网上有很多大佬做过解析。可以使用python的sphinx模块把rst格式转换为html格式。有一个地方要注意,如果是github上下载下来的文件,不用试图去转换README.rst(会提示少了个conf.py,一个配置样式的文件),直接去转换/docs/source/index.rst

扯得有点多了,继续~

二、操作部分
1、建立连接
import pymysql
import json
config = {
			'host' : 'localhost',
			'port' : 3306,
			'db' : 'my',
			'user' : 'root',
			'passwd' : 'lee',
			'charset' : 'utf8mb4',
			'cursorclass' : pymysql.cursors.DictCursor
		 }
#:连接数据库
conn = pymysql.connect(**config)
#:创建连接对象
cursor = conn.cursor()

(文末附上菜鸟的源码,json模块用来转换输出格式)
使用过mysql的同学对这些参数一定不会很陌生,连接数据库其中host(主机),db(数据库),user(用户名),passwd(密码)一定不能少,其余更多参数请自行查阅文档

2、执行mysql语句
#:执行查询版本号指令
cursor.execute('SELECT VERSION()')

#:执行删除命令(DONE)
cursor.execute('DROP TABLE IF EXISTS COLTYPE')

#:建表(DONE)
sql = '''create table monster(
		 name varchar(12),
		 speed tinyint,
		 rank tinyint)engine myisam charset utf8;
	   '''
cursor.execute(sql)

执行sql语句很简单,直接往cursor.execute()方法里传入MySql指令即可,我们既可以直接写入指令,又可以创建一个字符串变量传入。

3、插入数据的方式
#:添加数据(直接添加和用变量传输[注意%s %d等的引号])(DONE)
l_name = 'lxf'
l_speed = 1
l_rank = 1
cursor.execute('''INSERT INTO monster
				  VALUES
				  ('m-ls', 1, 0),
				  ('yjs', 2, 1),
				  ('gmq', 6, 2),
				  ('ccx', 10, 10),
				  ('%s', '%d', '%d')
				''' % (l_name, l_speed, l_rank))

##:按条件查询数据
cursor.execute("SELECT * FROM monster WHERE rank > '%d'" % 2)

可以直接按表结构把数据传入,也可以按格式化方法传入数据

4、事务
#:事务
try:
	#cursor.execute(" UPDATE monster SET rank = 3 WHERE rank <= '%d' " % 2)
	cursor.execute('''INSERT INTO monster
						VALUES
						('max-ls', 1, 10)
					''')
	#向数据库提交修改
	#conn.commit()
except:
	#事务回滚
	conn.rollback()

这里我把conn.commit()注释掉了,就是我在文章开头说的问题,但按照文档所说:

connection is not autocommit by default. So you must commit to save your changes

autocommit参数的默认值为false,应该需要commit才能修改成功,这个问题还需继续了解

5、获取数据与关闭连接
#:以下获取cursor.execute()返回的全部数据(DONE-always)
#:别的方法(fetchone/fetchmany([size]))
#:rowcount()方法返回execute影响的行数

data = cursor.fetchall()
datalist = json.dumps(data, indent = 1)
print(datalist)

fetch返回已调用的最近的cursor.execute()已作用的行,比如执行查询可以fetch到查询到的数据,以字典返回。这里json只起美化输出的作用,indent = 1会把字典以树状输出。

#:关闭连接
cursor.close()
conn.close()

基本流程就是这样,把TODO解决之后,我应该就不再研究pymysql了。看到这里的你,也挺不容易,有什么建议或问题欢迎一起交流,就这样啦!自我期待下一次更新~

# -*- coding:UTF-8 -*-
"""
总结:
1、建立连接connection
2、创建连接对象cursor
3、通过cursor.execute(str)方法执行mysql语句
4、处理事务:无异常connection.commit()向数据库提交修改
  发生异常connection.rollback()事务回滚
5、cursor.fecthall()获取上个最近的cursor.execute(str)所有返回信息
6、connection.close()关闭连接
"""
import pymysql
import json
config = {
			'host' : 'localhost',
			'port' : 3306,
			'db' : 'my',
			'user' : 'root',
			'passwd' : 'lee',
			'charset' : 'utf8mb4',
			'cursorclass' : pymysql.cursors.DictCursor
		 }
#:连接数据库
conn = pymysql.connect(**config)
#:创建连接对象
cursor = conn.cursor()

#:执行查询版本号指令
#cursor.execute('SELECT VERSION()')

#:执行删除命令(DONE)
#cursor.execute('DROP TABLE IF EXISTS COLTYPE')

#:建表(DONE)
#sql = '''create table monster(
#		 name varchar(12),
#		 speed tinyint,
#		 rank tinyint)engine myisam charset utf8;
#	   '''
#cursor.execute(sql)

#:查看表结构(DONE)
#cursor.execute('DESC monster')

#:查询数据(DONE)
#cursor.execute('SELECT * FROM monster')

#:添加数据(直接添加和用变量传输[注意%s %d等的引号])(DONE)
#l_name = 'lxf'
#l_speed = 1
#l_rank = 1
#cursor.execute('''INSERT INTO monster
#				  VALUES
#				  ('m-ls', 1, 0),
#				  ('yjs', 2, 1),
#				  ('gmq', 6, 2),
#				  ('ccx', 10, 10),
#				  ('%s', '%d', '%d')
#				''' % (l_name, l_speed, l_rank))
#
##:按条件查询数据
#cursor.execute("SELECT * FROM monster WHERE rank > '%d'" % 2)

#:delete(DONE)
#cursor.execute('DELETE FROM monster')

#:事务
try:
	#cursor.execute(" UPDATE monster SET rank = 3 WHERE rank <= '%d' " % 2)
	cursor.execute('''INSERT INTO monster
						VALUES
						('max-ls', 1, 10)
					''')
	#向数据库提交修改
	#conn.commit()
except:
	#事务回滚
	conn.rollback()

#:获取cursor.execute()返回的全部数据(DONE-always)
#:([Another] fetchone fetchmany([size]))
#:rowcount()是execute影响的行数
data = cursor.fetchall()
datalist = json.dumps(data, indent = 1)
print(datalist)

#:connection is not autocommit by default. So you must commit to save
#:your changes--(from pymysql doc) 貌似不用这样,可能是因为目前是管理员身份
#:待我查看autocommit参数的值是false...啥情况
#conn.commit()
#connAtributeList = conn.__dict__
#print(connAtributeList)

#:关闭连接
cursor.close()
conn.close()
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值