第十一章  数据库操作

本章所讲内容:

11.1  数据库介绍

11.2  MySQL 常识

11.3  pymysql使用

11.4  peewee使用

11.1  数据库介绍

11.1.1  数据库介绍

1.  数据描述事物的符号多种表现形式:文本,图形,音频,视频

2.  数据库(Database, DB)粮库  车库存放数据的仓库 存放在计算机中,按照一定格式存放  可为用户共享

3.  数据库管理系统(Database Management System, DBMS)如何科学的组织和存储数据,如何高效的获取和维护数据,靠数据库管理 系统完成,主要有 Oracle  MySQL SQL Server  DB2 FoxPro,Access

4.  数据库应用程序(Data Base Application System ,DBAS)在数据库管理系统基础上,使用数据库管理系统的语法,开发的直接面对最终用户的应用程序学生管理系统、人事管理系统、图书管理系统

 

5.  数据库管理员( Database Administrator, DBA )数据库管理系统的操作者

6.  最终用户数据库应用程序的使用者

7.  数据库系统( Database System, DBS 数据库+数据库管理系统+数据库应用程序+数据库管理员+最终用户

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

11.1.2  数据库的发展阶段

网状数据库

层次数据库

  1. 关系数据库

采用关系(二维表)结构储存与管理数据

采用结构化查询语言(SQL)作为客户端程数据库服务器间沟通的桥梁,

目前主流的数据库技术

  1. 面向对象数据库

把面向对象的方法和数据库技术结合起来可以使数据库系统的分析、设 计最大程度地与人们对客观世界的认识相一致

  1. NOSQL数据库

Not Only SQL数据库 泛指非关系数据库如MongoDB

关系数据库在超大规模和高并发的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

11.2  Mysql常识

11.2.1  Mysql介绍与安装

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。

MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

数据库官方网站:http://www.mysql.com/
数据库排名网站: http://db-engines.com/en/ranking

官方数据库排名:

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

Mysql 是一个关系型数据库

Mysql 数据库的名称          

database  数据库名                  

table  表名

Mysql 数据库基本操作和流程

Mysql支持Linux和windows等系统平台

Linux我们通过yum库可以安装mysql

Windows 我们可以到官方网站下载安装 https://www.mysql.com/downloads/

MariaDB mysql的一个分支

11.2.2 MySQL安装

1.  官方网站下载

 像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

 

2.  安装

 

 

点击下一步

 

等待安装依赖

 

点击下一步

 

 

点击下一步

 

点击下一步

 

 

点击下一步

 

点击下一步

 

 

点击finish

然后直接next

 

 

安装好mysql后我们可以在环境变量中配置path,将mysql中的bin目录加入到path中。
像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

11.2.2  运行Mysql

Windows

  1. 右击计算机à管理à服务和应用程序à服务àmysql
  2. 在cmd中 输入 net start mysql

Linux

service mysqld restart

 

11.2.3  登录数据库

使用命令连接

1、命令操作方式,在工作中使用的更多一些,所以要达到熟练的程度

2、打开终端,运行命令

mysql -uroot -p 回车后输入密码,当前设置的密码为123456

3、退出登录

quit或exit

4、登录成功后,输入如下命令查看效果

查看版本:select version(); 显示当前时间:select now();

5、注意:在语句结尾要使用分号;

打开cmd命令窗口,在命令行当中输入mysql –u user –ppassword

远程连接

一般在公司开发中,可能会将数据库统一搭建在一台服务器上,所有开发人员共用一个数据库,而不是在自己的电脑中配置一个数据库

运行命令

mysql -hip地址 -uroot -p

-h后面写要连接的主机ip地址

-u后面写连接的用户名

-p回车后写密码

mysql -uroot -p -h 192.168.1.98

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

 

 

查看或者创建数据库

help

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

查看数据库

show databases;

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

10.2.5 数据库操作

–DQL(数据查询语言)

select

–DML(数据操作语言)

insert、update、delete

 

–DDL(数据定义语言)

create、alter、drop

 

–DCL(数据控制语言)

grant、revoke

 

–TCL(事务控制语言)

SAVEPOINT 、 ROLLBACK、SET TRANSACTION ,COMMIT

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

 

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

 

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

11.3  pymysql

11.3.1  介绍

PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。

python2.x 版本当中运用 MySQLdb

python3.x 版本当中运用 pymysql

11.3.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文件

注意:轮子网站没有pymysql,只有mysql-python

Linux下安装

yum install MySQL-python –y11.3.3操作

脚本禁止起名为MySQLdb否则模块属性错误

MySQLdb 操作步骤

创建连接     connect

实例化游标   cursor

执行sql语句 execute

查看返回     

提交修改     commit

关闭游标和链接

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)
#提交给数据库,主要配合增删查改
#db.commit()
# 使用 fetchone() 方法获取单条数据.
# fetchall 查取所有,以元组的形式返回
data=cursor.fetchone()
#打印data
print(data)
#关闭游标
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()
# 使用fetchone() 方法获取单条数据.
# fetchall 查取所有,以元组的形式返回
# data=cursor.fetchone()
#打印data
# print(data)
#关闭游标
cursor.close()
# 关闭数据库连接
db.close()

删除

import pymysql
# 打开数据库连接
#参数可以分别为 本地地址,用户名,密码,数据库名
db=pymysql.connect("localhost", "root", "123456", "sql_test")
# 使用 cursor() 方法创建一个游标对象 cursor
cursor=db.cursor()
# 使用 execute()  方法执行sql语句

#drop的时候提不提交都行,delect 的时候要commit

#delect * from where id =1
cursor.execute("drop table test_sql")
#提交给数据库,主要配合增删查改
db.commit()
# 使用 fetchone() 方法获取单条数据.
# fetchall 查取所有,以元组的形式返回
# data=cursor.fetchone()
#打印data
# print(data)
#关闭游标
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 = whilewhere id = 1
cursor.execute("update test_sql set name = whilewhere id = 1")
#提交给数据库,主要配合增删查改
db.commit()
# 使用 fetchone() 方法获取单条数据.
# fetchall 查取所有,以元组的形式返回
# data=cursor.fetchone()
#打印data
# print(data)
#关闭游标
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是MySQL的默认引擎,但是它没有提供对数据库事务的支持,而InnoDB支持事务。

11.4  peewee数据库模块映射

11.4.1  peewee介绍

我们用上面的代码进行数据库操作是可行的,但是也存在很多的问题

假如开发人员不懂mysql,

有时候我们随着业务需求的变换,而转换另一种数据库进行操作

我们当前的pymysql对数据库数据的插入删除和修改不方便

这种情况,我们提出orm(Object Relational Mapping数据库映射)概念是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上来说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql 

 

11.4.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(了解一下)

11.4.3  类型转换

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

Class Meta像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

11.4.3 peewee连接mysql

Peewee和mysql数据库进行连接,生成数据库。

我们先看下用pycharm中调用mysql的步骤。

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

 

 

 

像玩乐高玩具一样用pythoon---积木模块peewee、pymysql

Peewee操作CRUD

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# from peewee import *
'''
peewee==3.6.4
python=3.5.1
'''

import peewee

settings = {'user': 'root', 'password': '1234567', 'host': '103.197.70.16', 'port': 3306}
peewee_mysql_db = peewee.MySQLDatabase(
    database='test_peewee_db',  # 数据库需要先建立好,这里是连接指定名称的数据库,返回一个数据库实例对象
    user='root',
    password='1234567',
    host='103.197.70.16'
)

'''
创建表less1(该方式没有生成自定义名称的表单)
'''

class BaseModel(peewee.Model):
    """A base model that will use our MySQL database"""

    class Meta:
        """指定数据库."""
        database = peewee_mysql_db
        table_name = '测试peewee建表'

class peewee_table(BaseModel):
    name = peewee.CharField(max_length=32, verbose_name='用户名', default='shen')
    age = peewee.IntegerField(verbose_name='年龄', default=10)
    create_time = peewee.DateTimeField(verbose_name='生成时间')

'''
创建表less2
'''

class peewee_table2(peewee.Model):
    name = peewee.CharField(max_length=32, verbose_name='用户名', default='shen')
    age = peewee.IntegerField(verbose_name='年龄', default=10)
    create_time = peewee.DateTimeField(verbose_name='生成时间')

    class Meta:
        database = peewee_mysql_db  # 指定数据库(数据库需要提前创建好)
        table_name = '测试peewee建表'  # 这里可以自定义表名

if __name__ == '__main__':
    # 创建表
    peewee_table.create_table()
    peewee_table2.create_table()

    '''
    # 插入数据
    pt = peewee_table2()
    pt.name = 'shen'
    pt.age = 22
    pt.create_time = datetime.datetime.now()
    pt.save()

     # 插入数据第二种方式
    peewee_table2.insert(name='小龙女', age=18, create_time='2018-6-12').execute()
    '''

    '''
    # 删除数据(单条数据删除)
    pt_obj = peewee_table2.get(name='shen')
    pt_obj.delete_instance()
    '''
    '''
    # 第二种删除数据
    peewee_table2.delete_by_id(2)
    # 第三种删除数据
    peewee_table2.delete().where(peewee_table2.age == 33).execute()
    '''

    '''
    更新数据
    peewee_table2.update(name='shen').where(peewee_table2.name=='jie').execute()
    '''

    '''
    # 查询数据
    pts = peewee_table2.select()
    for pt in pts:
        print(pt)
        print(pt.name)
        print(pt.age)
        print(pt.create_time)
    # 条件查询
    pt = peewee_table2.get(peewee_table2.name == 'shen')
    print(pt)
    print(pt.name, pt.age, pt.create_time)
    # 正序查询,倒序查询
    s = peewee_table2.select().order_by(peewee_table2.name.desc())
    for i in s:
        print(i)
        print(i.age)
        print(i.name)

    #模糊查询

    '''

 

11.4.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)

 

总结:

11.1  数据库介绍

11.2  MySQL 常识

11.3  pymysql使用

11.4  peewee使用

 

相关文章:

  • 2021-11-13
  • 2021-10-23
  • 2021-06-03
  • 2021-06-25
  • 2021-12-20
  • 2022-12-23
  • 2022-01-13
  • 2021-08-16
猜你喜欢
  • 2021-05-24
  • 2021-04-08
  • 2021-06-22
  • 2021-05-02
  • 2021-10-15
  • 2021-07-03
  • 2021-08-02
相关资源
相似解决方案