数据库(database):存放数据的仓库,是一些关联表的集合。
RDBMS(Relational DataBase Management System):关系数据库管理系统,是将数据组织为行和列的系统,是所有现代数据库系统的基础。
RDBMS的特点:
1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成数据库
RDBMS术语:
1.数据库:一些关联表的集合。
2.数据表:数据的矩阵,数据库中的表看起来像一个个简单的电子表格。
3.行:行也称为记录,是一组相关的数据。
4.列:列也称为数据元素,包含了相同的数据。
5.冗余:存储两倍的数据。
6.主键:一个数据表中主键是唯一的,可以用主键来查询数据。
7.外键:用于关联两个数据表。
8.索引:是对数据表中一列或多列的值进行排序的一种结构。类似于书籍目录。使用索引可以快速访问数据库表中的特定信息。
9.复合键:将多个列作为一个索引,一般用于复合索引。
10.参照完整性:参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
SQLite:SQLite是一个实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎。
ACID事务:事务(Transaction),和现实世界中的交易很类似。
1.A(Atomicity)原子性:事务成功的条件是事务里所有的操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。
2.C(Consistency)一致性:数据库要一直处于一致的状态,事务的运行不会改变数据库的一致性约束。
3.I(Isolation)独立性:并发的事务之间不会互相影响,如果有一个事务要访问的数据正在被另外一个事务修改,只要另一个事务未提交,它访问的数据就不受未提交事务的影响。
4.D(Durability)持久性:指一旦事务提交后,它所做的修改将会永久的保存在数据库上。
要使用SQLite,必须先安装它:Python3自带sqlite3,旧版本Python必须安装PySQLite才能使用SQLite数据库。然后需要连接到数据库,可以使用函数connect,这个函数接受多个参数,具体是哪些参数取决于使用的数据库。
函数connect的常用参数
参数名 | 描述 | 是否可选 |
---|---|---|
dsn | 数据源名称(具体含义随数据库而异) | 否 |
user | 用户名 | 是 |
password | 用户密码 | 是 |
host | 主机名 | 是 |
database | 数据库名称 | 是 |
函数connect返回一个连接对象,表示当前到数据库的会话。
连接对象的方法
方法名 | 描述 |
---|---|
cursor() | 返回连接的游标对象 |
commit() | 提交未提交的事务 |
rollback() | 回滚未提交的事务(可能不可用) |
close() | 关闭连接对象。关闭后连接对象及其游标将不可用 |
连接对象的cursor()方法返回一个游标对象,使用游标来执行SQL操作。
游标对象的方法
名称 | 描述 |
---|---|
fetchone() | 以序列的方式取回查询结果的下一行;如果没有更多的行,则返回None |
fetchall() | 以序列的方式取回余下的所有行 |
fetchmany([size]) | 取回查询结果中的多行,参数size默认arraysize |
execute(oper[, params]) | 执行一个SQL操作(可指定参数) |
executemany(oper, pseq) | 执行指定的SQL操作多次 |
close() | 关闭游标,关闭后,游标不可用 |
nextset() | 跳到下一个结果集,这个方法是可选的 |
setinputsize(size) | 用于为参数预定义内存区域 |
setoutputsize(size[, col]) | 为取回大量数据而设置缓冲区长度 |
callproc(name[, params]) | 使用指定的参数调用指定的数据库过程(可选) |
游标对象的属性
名称 | 描述 |
---|---|
description | 由结果列描述组成的序列(只读) |
rowcount | 结果包含的行数(只读) |
arraysize | fetchmany返回的行数,默认为1 |
sqlite3的使用(Python3)
import sqlite3
def create_table():
# 创建到数据库文件的连接
# 只需提供一个文件名(文件路径为相对路径或者绝对路径)
# 如果指定的文件不存在,将自动创建
conn = sqlite3.connect("stu.db")
# 从连接对象获取游标
curs = conn.cursor()
# 创建一个数据表
curs.execute("""
CREATE TABLE mytest (
id TEXT PRIMARY KEY,
name text,
age INT
)
""")
# 插入两条数据
curs.execute("INSERT INTO mytest VALUES (1, 'tom', 20)")
curs.execute("INSERT INTO mytest VALUES (2, 'andy', 28)")
# 提交所做的操作
conn.commit()
# 关闭连接
conn.close()
def query_from_table():
# 连接到数据库
conn = sqlite3.connect("stu.db")
# 获取游标
curs = conn.cursor()
# 执行查询操作
curs.execute("SELECT * FROM mytest")
# 获取查询到的所有数据
datas = curs.fetchall()
print("data is: %s, %s" % (type(datas), datas))
# 提交操作
conn.commit()
# 关闭连接
conn.close()
if __name__ == '__main__':
# 创建数据表
create_table()
# 从表中查询数据
query_from_table()
上面程序的执行结果为
data is: <class 'list'>, [('1', 'tom', 20), ('2', 'andy', 28)]
从程序输出可以看出,fetchall返回一个list,该list的每一个元素都是tuple。