1 数据库
为了存储数据并且能够快速查询等功能专门形成的
现代使用的数据库一般都是关系型数据库
NoSQL尽管宣传其速度和规模远远超过关系数据库, 但是还是要先明白SQL
常用的数据库有Oracle, SQL Server, DB2, MySQL, PostgreSQL, sqlite
2 使用SQLite
SQLite就是一嵌入式的数据库, 数据库就是一个文件, 本身是c写的, 体积更小
python中内置了SQLite3
1) 建立数据库链接
db_file = os.path.join(os.path.dirname(__file__), 'test.db')
if os.path.isfile(db_file):
os.remove(db_file)
conn = sqlite3.connect(db_file)
2) 生成游标cursor
cursor = conn.cursor()
3) 执行SQL语句
cursor.execute('create table user(id varchar(20) primary key, name varchar(20), score int)')
cursor.execute(r"insert into user values ('A-001', 'Adam', 95)")
cursor.execute(r"insert into user values ('A-002', 'Bart', 62)")
cursor.execute(r"insert into user values ('A-003', 'Lisa', 78)")
4) 查询并获得结果
cursor.execute(r"SELECT name FROM user WHERE score > ? and score < ? ORDER BY score", (low, high))
values = cursor.fetchall()
5) 关闭游标, 提交事务, 断开链接
cursor.close()
conn.commit()
conn.close()
3 使用mysql
mysql是世界上使用最广泛的数据库服务器, 能够承受高并发
mysql内部有多种数据库引擎, 最常用的引擎是支持数据库事务的lnnoDB
设置编码为UTF8
安装
pip install mysql-connector-python --allow-external mysql-connector-python
# 如果上述失败执行可以执行这句
pip install mysql-connector
1) 建立连接并生成游标
import mysql.connector
conn = mysql.connector.connect(user='root', password='password', database='test')
cursor = conn.cursor()
2) 执行语句, 查询和获得结果
cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
print(cursor.rowcount)
cursor.execute('select * from user where id = %s', ('1',))
values = cursor.fetchall()
print(values)
3) 提交事务, 关闭游标关闭连接
conn.commit()
cursor.close()
conn.close()
4 使用SQLAlchemy
数据库是一个二维表, 包含多行多列
在Python可以构造一个结构来对应这个多行多列的表, 可以用一个列表存储整个表, 每一行用一个元组表示放入到列表中
但是由于用元组表示一行还是不直观
可以根据表格的内容, 对应一行的信息创建一个类, 那么每一行就是这个类的对象
这就是ORM(object-relational mapping)
在Python中最有名的orm框架是SQLAlchemy
安装SQLAlchemy
pip install sqlalchemy
使用SQLAlchemy
1) 导入必要内容
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
2) 创建对象类的基类
Base = declarative_base()
3) 继承该基类创建对象类
class User(Base):
# 表的名字:
__tablename__ = 'user'
# 表的结构:
id = Column(String(20), primary_key=True)
name = Column(String(20))
4) 创建数据库链接
engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
链接格式为
'数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
5) 将数据库链接绑定给sessionmaker来创建DBSession, 并生成session对象
DBSession = sessionmaker(bind=engine)
session = DBSession()
6) 创建一个user对象并添加到表中
new_user = User(id='5', name='Bob')
session.add(new_user)
session.commit()
session.close()
7) 执行查询操作
user = session.query(User).filter(User.id=='5').one()
print('type:', type(user))
print('name:', user.name)
session.close()
其中query()用于创建一个查询
filter()用于创建一个where条件
one()表示返回一行, all()返回所有行
关于对象之间的关系
根据外键可以实现一对多, 多对多等关联
一对多的关系设定如下
class User(Base):
__tablename__ = 'user'
id = Column(String(20), primary_key=True)
name = Column(String(20))
# 一对多:
books = relationship('Book')
class Book(Base):
__tablename__ = 'book'
id = Column(String(20), primary_key=True)
name = Column(String(20))
# “多”的一方的book表是通过外键关联到user表的:
user_id = Column(String(20), ForeignKey('user.id'))