第十三章 数据库模块操作
本章所讲内容:
13.1 pymysql
13.2 peewee
13.1 pymysql
13.1.1 介绍
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。
python2.x 版本当中运用 MySQLdb
python3.x 版本当中运用 pymysql
13.1.2 安装
pip3 install mysql-python
pip3 install pymysql
安装以后进行导入
>>>import pymysql
完成导入没有报错说明安装成功。
轮子安装:
- 轮子网站:https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud
- 安装wheel 模块
pip3 install wheel(安装whl文件必备模块) - 启动cmd ,进入到whl的下载目录。
pip3 install whl文件
网络不好:换源一步解决
网络是不是完好
我们可以用pip install scrapy –i 国内源
阿里云 http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
注意:轮子网站没有pymysql,只有mysql-python
Linux下安装
yum install MySQL-python –y11.3.3操作
注:脚本禁止起名为MySQLdb,否则模块属性错误
MySQLdb 的操作步骤
创建连接 connect
实例化游标 cursor
执行sql语句 execute
提交修改 commit
事务回滚 rollback
关闭游标和链接
connect 后面的参数
host=None, # 要连接的主机地址
user=None, # 用于登录的数据库用户
password='', # 密码
database=None, # 要连接的数据库
port=0, # 端口,一般为 3306
charset='', # 字符编码
conv=None, # 转换字典
use_unicode=None, # 是否使用 unicode 编码
init_command=None, # 连接建立时运行的初始语句
connect_timeout=10, # 连接超时时间,(default: 10, min: 1, max: 31536000)
autocommit=False, # 是否自动提交事务
db=None, # 同 database,为了兼容 MySQLdb
passwd=None, # 同 password,为了兼容 MySQLdb
local_infile=False, # 是否允许载入本地文件
read_timeout=None, # 读取超时时间
write_timeout=None, # 写入时间
import pymysql
# 打开数据库连接
#参数可以分别为 本地地址,用户名,密码,数据库名
db=pymysql.connect("localhost", "root", "123456", "sql_test")
# 使用 cursor() 方法创建一个游标对象 cursor(通俗的理解为操作者)
cursor=db.cursor()
sql = '''create table test_sql(
id INT PRIMARY KEY auto_increment,
name VARCHAR (30),
age INT
) '''
# 使用 execute() 方法执行sql语句
cursor.execute(sql)
#关闭游标
cursor.close()
# 关闭数据库连接
db.close()
增添数据
import pymysql
# 打开数据库连接
#参数可以分别为 本地地址,用户名,密码,数据库名
db=pymysql.connect("localhost", "root", "123456", "sql_test")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor=db.cursor()
# 使用 execute() 方法执行sql语句
cursor.execute("insert into test_sql(name,age) VALUE ('for',19)")
#提交给数据库,主要配合增删查改
db.commit()
#关闭游标
cursor.close()
# 关闭数据库连接
db.close()
删除
import pymysql
# 打开数据库连接
#参数可以分别为 本地地址,用户名,密码,数据库名
db=pymysql.connect("localhost", "root", "123456", "sql_test")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor=db.cursor()
# 使用 execute() 方法执行sql语句
#drop的时候提不提交都行,delect 的时候要commit
#delete from tab_name where id =1
cursor.execute("drop table test_sql")
#提交给数据库,主要配合增删查改
db.commit()
#关闭游标
cursor.close()
# 关闭数据库连接
db.close()
自主更改:
import pymysql
#打开数据库连接,charset ='utf-8',
#本地地址,用户名,密码,数据库名
db = pymysql.connect("127.0.0.1","root","123456","sql_test")
# db = pymysql.connect
#使用游标,创建一个游标对象
cursor = db.cursor()
#普通的sql语句
# sql = "create table meinv_test(id int PRIMARY KEY auto_increment,name VARCHAR (30),age INT )"
sql = "insert into meinv_test(name,age) VALUE (%s,%s)"
while True:
name = input('请输入你输入的姓名:')
age = int(input('输入一串数字:'))
#execute()这行SQL语句
cursor.execute(sql,[name,age])
#提交
db.commit()
#关闭游标
cursor.close()
#关闭数据库
db.close()
更改
import pymysql
# 打开数据库连接
#参数可以分别为 本地地址,用户名,密码,数据库名
db=pymysql.connect("localhost", "root", "123456", "sql_test")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor=db.cursor()
# 使用 execute() 方法执行sql语句
#update test_sql set name = ‘while’where id = 1
cursor.execute("update test_sql set name = ‘while’where id = 1")
#提交给数据库,主要配合增删查改
db.commit()
#关闭游标
cursor.close()
# 关闭数据库连接
db.close()
数据库查询操作
Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据。
- fetchone(): 该方法获取下一个查询结果集。结果集是一个对象
- fetchall(): 接收全部的返回结果行.
- rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数。
import pymysql
# 打开数据库连接
#参数可以分别为 本地地址,用户名,密码,数据库名
db=pymysql.connect("localhost", "root", "123456", "sql_test")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor=db.cursor()
# 使用 execute() 方法执行sql语句
#select * from test_sql
cursor.execute("select * from test_sql ")
# 使用 fetchone() 方法获取单条数据.
# fetchall 查取所有,以元组的形式返回
# data=cursor.fetchone()
#打印data
# print(data)
#关闭游标
cursor.close()
# 关闭数据库连接
db.close()
事务回滚rollback()
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
- 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
- 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
- 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
Python DB API 2.0 的事务提供了两个方法 commit 或 rollback。
案例:
# SQL删除记录语句 sql = "DELETE FROM test_sql WHERE AGE ='%d'" % (20)
try:
# 执行SQL语句
cursor.execute(sql)
# 向数据库提交
db.commit()
except:
# 发生错误时回滚
db.rollback()
mysql中比较常用搜索引擎?(面试)
在这里咱们主要了解一下,MySQL有两大搜索引擎,一个是InnoDB 、MyISAM他们的具体区别是:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。
mysql>show engines; 查看数据库引擎
13.2 peewee数据库模块映射
13.2.1 peewee介绍
我们用上面的代码进行数据库操作是可行的,但是也存在很多的问题
假如开发人员不懂mysql,
有时候我们随着业务需求的变换,而转换另一种数据库,进行操作
我们当前的pymysql对数据库数据的插入、删除和修改不方便。
在这种情况下,我们提出orm(Object Relational Mapping数据库映射)概念,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上来说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
13.2.2 peewee安装
普通安装
orm 模块 peewee
pip3 install peewee
轮子安装:
轮子网站:https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud
安装wheel 模块
pip3 install wheel(安装whl文件必备模块)
启动cmd ,进入到whl的下载目录。
pip3 install whl文件
peewee 支持三种数据库
Mysql
Sqllite
Postgresql(了解一下)
13.2.3 类型转换
Class Meta
13.2.3 peewee连接mysql
Peewee和mysql数据库进行连接,生成数据库。
我们先看下用pycharm中调用mysql的步骤。
import peewee import datetime
#连接数据库 connect = peewee.MySQLDatabase( database = 'sql_test', host = '127.0.0.1', user = 'root', passwd = '123456' )
#继承peewee.Model,创建一个表。
#peewee创建数据库的时候,默认会添加主键id
#peewee创建数据库字段默认不可为空
class School(peewee.Model):
name = peewee.CharField(max_length=20,default='for')
address = peewee.CharField(max_length=30,default='xuegod')
age = peewee.IntegerField(default=18)
birthday = peewee.DateTimeField()
#将表和数据库连接 class Meta: database = connect
if __name__ == '__main__':
#创建表,创建多个表的时候用列表[] School.create_table() #插入数据 # s = School.create(name='for',age=12,birthday = '2017-10-10') # s.save() #第二种插入方法 # School.insert(name = '小龙女',age = 18,birthday = '2018-6-12').execute()
#更新数据 # School.update(name = '杨过',age = 10,birthday ='2018-5-10').where(School.id==1).execute()
#删除数据 # s = School.get(name = '杨过') # s.delete_instance() #第二种删除数据 # School.delete_by_id(2) # School.delete().where(School.id == 5).execute()
#查询语句 # s = School.select() # for i in s: # print(i.name,i.age) # s = School.get(School.id == 3) # print(s.name,s.age)
#有条件的查询 # s = School.select().where(School.id == 3) # for i in s: # print(i.name)
#正序查询,倒序查询 s = School.select().order_by(School.id.asc()) s = School.select().order_by(School.id.desc()) for i in s: print(i.age)
13.2.3 peewee和 sqlite3 使用
Sqllite3 是一款nosql的轻量级数据库,python 2.7之后自动携带sqllite3
生成sqlite3数据库
>>>import sqlite3
#如果没有就会直接生成
>>>db = sqlite3.connect('test.db')
pycharm加载数据库
import peewee
db = peewee.SqliteDatabase('sql.db')
class Teacher(peewee.Model):
name = peewee.CharField(max_length=20,default='for')
age = peewee.IntegerField()
class Meta:
database = db
if __name__ == '__main__':
#创建表
# Teacher.create_table()
#增加
T = Teacher()
T.name = 'for'
T.age = 18
T.save()
#增加
T = Teacher().insert(
name = '小龙女',
age = 18,
)
T.execute()
#删除
T = Teacher.delete().where(Teacher.id == 1)
T.execute()
#修改
T = Teacher.update(name = 'for').where(Teacher.id ==1)
T.execute()
T = Teacher().get(id = 2)
T = Teacher().get_by_id(2)
T.name = '杨过'
T.save()
#查找
T_list = Teacher.select()
for i in T_list:
print(i.name,i.age)
T_list = Teacher.select().order_by(Teacher.age)
for i in T_list:
print(i.name,i.age)
#查一条
T_list = Teacher.select().where(Teacher.age == 18)
for i in T_list:
print(i.name,i.age)
T = Teacher.get(id = 2)
print(T.name,T.age)
总结:
13.1 pymysql
13.2 peewee
附录:
pycharm 中设置各种源的方法,配置好之后方便咱们下载。