第十三章  数据库模块操作

本章所讲内容:

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

完成导入没有报错说明安装成功。

轮子安装:

  1. 轮子网站:https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud
  2. 安装wheel 模块
    pip3 install wheel(安装whl文件必备模块)
  3. 启动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 中设置各种源的方法,配置好之后方便咱们下载。

数据库模块操作

数据库模块操作

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-07
  • 2021-07-25
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-04-28
  • 2021-09-19
  • 2022-12-23
  • 2022-12-23
  • 2021-11-02
  • 2021-10-20
相关资源
相似解决方案