Python操纵数据库(MySQL)
一、写在最前面
今天学习了PyMysql,总结了一下使用方法(流程):
- 建立连接connection
- 创建连接对象cursor
- 通过cursor.execute(str)方法执行mysql语句
- 处理事务:无异常connection.commit()向数据库提交修改;发生异常则调用connection.rollback()事务回滚
- cursor.fecthall()获取上个最近的cursor.execute(str)所有返回信息
- 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()