数据库模块操作

xiaoxiao2025-09-14  249

                                       第十三章  数据库模块操作

本章所讲内容:

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() 方法创建一个游标对象 cursorcursor=db.cursor()# 使用 execute()  方法执行sql语句

#update test_sql set name = ‘while’where id = 1cursor.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() 方法创建一个游标对象 cursorcursor=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 中设置各种源的方法,配置好之后方便咱们下载。

 

转载请注明原文地址: https://www.6miu.com/read-5036303.html

最新回复(0)