第17章 数据库操作
17.1 sqlite3数据库
SQLite 是一个C语言库,它可以提供一种轻量级的基于磁盘的数据库,这种数据库不需要独立的服务器进程,也允许需要使用一种非标准的 SQL 查询语言来访问它。一些应用程序可以使用 SQLite 作为内部数据存储。可以用它来创建一个应用程序原型,然后再迁移到更大的数据库,比如 PostgreSQL 或 Oracle。
Python3内置sqlite3模块用于操作数据库,只需直接导入模块即可。
17.1.1 sqlite3模块
-
内置常量
- sqlite3.version 以字符串形式记录了模块的版本号。
- sqlite3.sqlite_version 以字符串形式记录了sqlite数据库的版本号。
- sqlite3.isolation_level 用于配置隔离级别。
- sqlite3.in_transaction 布尔值,活动状态标记。
-
connection对象
-
sqlite3.connect(database, timeout, *args) 可以读取或创建数据库文件,并返回connection对象。
- “:memory:" 作database时,可以在RAM中打开一个数据库连接,而不是在磁盘上。
- 若一个数据库被多个连接访问,一个用户的事务会被锁定,直到事务提交。
- 参数timeout表示连接等待锁定的持续时间,直到发生异常断开。
- 若数据库名database不存在,会自动创建一个,可以使用带有路径的名称来指定创建位置。
-
connection对象中包含非常多操作数据库的方法,详情查找文档。
-
-
cursor对象
- 该对象含有 execute() 等方法,可用于执行SQL语句。
- 连接对象的connection.cursor(cursorClass) 方法可以创建并返回cursor对象。
- 该方法只有一个可选参数,只能是sqlite3.Cursor类的自定义子类。
-
cursor.execute(sql, optionalParam) 方法:
- 可以用占位符传参的形式执行一条SQL语句,类似java的PreparedStatement接口。
import sqlite3 # 引入模块 conn = sqlite3.connect(":memory:") # 在内存中建立数据库,并获取连接 curs = conn.cursor() # 从连接对象中获取光标对象 curs.execute("create table t_student(Sname, Sage)") # 用光标对象执行SQL语句创建表 name = "Jarjack" age = 18 # 1. 以“?”作占位符的形式执行SQL语句 curs.execute("insert into t_student values (?, ?)",(name,age)) # 2. 以参数命名的形式作占位符执行SQL语句 curs.execute("select * from t_student where Sname= :name",{"name":name}) # 3. 从结果集抓取一条记录输出。 print(curs.fetchone())
-
cursor.executemany(sql, seq_of_param)方法:
- 可以自动将seq_of_param序列中的所有参数依次执行一条SQL。
import sqlite3 # 引入模块 conn = sqlite3.connect(":memory:") # 在内存中建立数据库,并获取连接 curs = conn.cursor() # 从连接对象中获取光标对象 curs.execute("create table t_student(Sname, Sage)") # 用光标对象执行SQL语句创建表 # 1. 定义参数表的序列 students_param = [["张学友",24],["刘德华",25],["郭富城",19],["黎明",28]] # 2. 以“?”作占位符,以参数表的序列作为参数,依次为每个参数表执行数据插入。 curs.executemany("insert into t_student values (?,?)", students_param) # 3. 执行查询,返回结果集到cursor对象。 curs.execute("select * from t_student") print(curs.fetchall()) # 从结果集抓取一条记录输出。
-
cursor.executescript(sql, optional_param)方法:
- 执行多台SQL语句作为脚本,首先执行commit语句,再执行输入的脚本,每条语句用“;”分隔。
- 在executescript()中执行的查询,不会返回结果集给cursor对象,要另外用execute()查询。
import sqlite3 # 引入模块 conn = sqlite3.connect(":memory:") # 在内存中建立数据库,并获取连接 curs = conn.cursor() # 从连接对象中获取光标对象 # 1. 执行多条SQL语句 curs.executescript(""" create table t_person(name, age, sex); insert into t_person values("Jarjack",18,"male"); insert into t_person values("Leon",25,"male"); """) curs.execute("select * from t_person") # 再另外执行的查询 print(curs.fetchall())
-
可以在connection对象中调用execute()方法,相当于一种快捷方式,它会先建立一个临时的cursor对象,再由该对象执行。
- connection.execute()
- connection.executemany()
- connection.executescript()
-
connection对象和cursor对象中还有许多数据库操作的方法,如提交、回滚、创建函数、权限管理等,详情查找文档。
17.1.2 sqlite3的数据类型
-
sqlite3仅支持5种类型:NULL, INTEGER, REAL, TEXT, BLOB,分别对应Python中的None, int, float, str, bytes类型。
-
若实际中需要处理多种类型,就需要用到类型扩展技术,一是对象适配,二是强制类型转换。
17.2 MySQL数据库
-
在Python安装MySQL的驱动模块PyMySQL,下载地址:https://github.com/PyMySQL/PyMySQL
- 可以使用管理工具pip安装:
pip install PyMySQL
- 可以使用管理工具pip安装:
-
在Python连接并操作MySQL数据库:
# 1. 引入MySQL驱动模块 import pymysql # 2. 连接数据库获取连接对象 conn = pymysql.connect(host="localhost",user="root",password="123456",database="db_practice") # 3. 在连接对象中获取光标对象用于执行SQL curs = conn.cursor() try: # 4. 插入数据 curs.execute("insert into t_dpmt values(50,'manufacture','Los Angle')") # 5. 更新数据(类型占位符预编译的方式!) curs.execute("update t_dpmt set locate='%s' where name='%s'" % ('guangzhou','manufacture')) # 6. 删除数据(类型占位符预编译的方式!) curs.execute("delete from t_dpmt where locate='%s'" % "guangzhou") # 7. 提交事务,使操作持久化到数据库(没有commit()数据不会保存,仅在面板中显示)。 conn.commit() # 8. 查询数据 curs.execute("select * from t_dpmt") # cursor对象保存结果集 resultset = curs.fetchall() # 获取结果集 for row in resultset: # 按行解析结果集 id = row[0] name = row[1] locate = row[2] print(id, name, locate) # 输出行 except: print("语句不正确!") conn.rollback() # 出现操作异常时回滚 finally: conn.close() # 最后关闭连接
17.3 MariaDB数据库
- 安装驱动模块
pip install mysql-connector
。其他略。