关系型数据库在Web项目中的应用
-
关系型数据库
关系型数据库采用关系模型组织数据,关系模型的核心是表。
常用概念- 关系:可以理解为一张二维表
- 元组:可以理解为二维表中的一行,通常称为记录
- 属性:可以理解为二维表中的一列,通常称为字段
- 主键:一组可以唯一标识元组的属性,由一列或多列组成
优势 - 便于理解
- 易于维护
缺陷 - 高并发情况下,硬盘I/O是传统关系型数据库一个很大的瓶颈
- 在表中查询数据的效率不高
- 横向扩展较难,数据库升级和扩展时,需要数据的迁移
主流关系型数据库
MySQL, Oracle, DB2, Microsoft Access等
ORM与SQLAlchemy
ORM全程Object Relational Mapping,即对象关系映射。ORM将数据库中的表与面向对象语言中的类建立了一种对应关系,对数据库的操作就通过操作类来完成。
SQLAlchemy是Python编程语言下的一款ORM框架,它能兼容众多数据库,在Python Web框架中得到了广泛应用。连接MySQL
启动MySQL
1.MySQL安装好后,在/mysql/my.ini中进行配置。
[mysqld] skip-grant-tables #设置3306端 port = 3306 # 设置mysql的安装目录 basedir = path # 设置mysql数据库的数据的存放目录 datadir=I:\mysql-5.7.23-winx64\data # 允许最大连接数 max_connections=200 # 服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8
2.配置环境变量。变量名MYSQL_HOME,变量值为mysql的根目录,在path中添加MYSQL_HOME%/bin目录
3.在/mysql/bin下注册mysql服务。使用管理员权限打开命令行,切换到mysql的bin目录下,输入命令mysqld.exe --install MySql --defaults-file="d:/mysql/my-default.ini"
4.启动mysql服务。在命令行输入
net start mysql
成功会提示,MySql服务已经启动成功
5.启动MySQL
mysql -uroot -p
6.创建数据库。启动数据库后,输入以下命令创建新数据库
> create database MyDatabase
安装SQLAlchemy
1.安装依赖PyMySQL,在命令行输入指令
pip install PyMySQL
2.安装sqlalchemy
pip install sqlalchemy
连接数据库
新建Python文件,写入以下内容from sqlalchemy import create_engine engine = create_engine('mysql+mysqldb://root@localhost:3306/blog') print(engine)
此时,默认连接运行在3306端口的MySQL中的数据库
用SQLAlchemy描述表结构
创建一个Python文件,建立一个User表。
from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, String, Integer class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) username = Column(String(64), nullable=False, index=True) password = Column(String(64), nullable=False) email = Column(String(64), nullable=False, index=True) def __repr__(self): return '%s(%r)' % (self.__class__.__name__, self.username)
在User类中,__tablename__指定该类在MySQL中表的名字;同时创建了三个字段,Column代表数据库中的一列,并配置一些属性,第一个字段代表数据类型,nullable=False表示该字段不可以为空,index表示在该列创建索引;定义__repr__用于接口之间传递参数。