数据库模块操作

                                       第十三章  数据库模块操作

本章所讲内容:

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 中设置各种源的方法,配置好之后方便咱们下载。

 

原创文章 49 获赞 23 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Smile_Mr/article/details/83383916