1、SQL AIchemy介绍
python可以使用很多数据库,MySQL、MongoDB、SQLite、PostgreSQL,redis、mongo等,以MySQL为例(只需要会它的安装和连接以及基本使用就可以在flask中运用详情点击查看),除了用SQL语句操作数据库外,在flask中可以使用ORM来操作数据库,使用ORM操作数据库会很便捷
1.1使用环境
①MySQL:通过安装phpstudy集成环境开启MySQL服务,点击查看
②PyMySQL:它是python用来操作MySQL的包,通过pip install pymysql
安装
③SQLAlchemy:它是数据库的ORM框架,通过pip insatll SQLalchemy
安装
1.2使用说明
①创建引擎
首先要从SQLalchemy中导入create_engine,用这个函数去创建引擎,创建数据库引擎的时候会要传一个固定格式的字符串,dialect+driver://username:password@host:port/database?charset=utf8
dialect是数据库类型是mysql还是sqlite等,要小写,driver是python对应的驱动,MySQL默认的驱动是MySQLdb,其次是用户名:密码@连接数据库的域名:数据库监听的端口号/连接的哪个数据库,指定字符集
②创建连接
用engine.connect()去连接数据库,实现python操作MySQL数据库
1.3示例
from sqlalchemy import create_engine
HOSTNAME = '127.0.0.1' # 连接数据库地址 -->小区
DATABASE = 'test' # 数据库 -->单元
PORT = 3306 # 端口 -->门牌号
USERNAME = 'root' # 用户名和密码 -->开锁
PASSWORD = 'root'
# 用户名对应密码,地址对应端口,连接的哪个数据库
# 如果报了警告,就pip install mysql-connector 将pymysql换为mysqlconnector就好,这是因为最新的官方版本想要我们用最新的去使用
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
engine = create_engine(DB_URL) # 创建数据库引擎
with engine.connect()as conn: # 创建连接
result = conn.execute('select * from student') # 执行sql语句,原生的sql写法,后面会讲ORM操作数据库
print(result) # 它是一个对象,打印出来的是内存地址 <sqlalchemy.engine.result.ResultProxy object at 0x000001C9581A5DC8>
print(result.fetchone()) # 打印出一条表中的结果,以元组的形式输出(1, 'beiyue', 'M')
1.4使用sqlalchemy
一般会将固定格式的字符串写成一个py文件,操作哪个库就导入文件中的哪个固定内容
from sqlalchemy import create_engine
from constants import DB_URI
#连接数据库,让数据显示出来
engine = create_engine(DB_URI,echo=True)
# 使用with语句连接数据库,如果发生异常会被捕获
with engine.connect() as con:
# 先删除users表
con.execute('drop table if exists authors')
# 创建一个users表,有自增长的id和name
con.execute('create table authors(id int primary key auto_increment,'name varchar(25))')
# 插入两条数据到表中
con.execute('insert into persons(name) values("abc")')
con.execute('insert into persons(name) values("xiaotuo")')
# 执行查询操作
results = con.execute('select * from persons')
# 从查找的结果中遍历
for result in results:
print(result)
2、ORM
在flask框架中会使用ORM来操作和管理数据库而不用原生的sql语句,如果只是进行简单的爬取数据和入库操作则可以选择使用原生的SQL语句
2.1ORM定义
对象关系映射(object relationship mapping),通过ORM我们可以通过类的方式去操作数据库,不用写原生的sql语句,将类映射为一张表,属性映射为表字段,实例化的对象映射为一条记录,底层封装的还是sql语句,但是方便我们操作,更加的便捷。
2.2为什么不用原生的sql进行操作数据库
①随着项目的扩大,代码会显得臃肿不好维护,sql语句的复用率不高,会出现很多类似但又不同的冗长的sql语句
②很多sql语句是在业务逻辑中拼出来的,如果数据库更改了,就要改sql语句,工作量大,且容易遗漏一些sql语句
2.3ORM的优点
①易用性:使用ORM做数据库开发可以有效的减少sql语句的书写,写出的模型更加的直观
②设计灵活:可以轻松的写出很复杂的查询语句
③可移植性:SQLAlchemy封装了底层的数据库实现,支持多种关系型数据库
2.4SQLAlchemy的使用
要使用ORM操作数据库,就要先创建一个类来与对应的表映射,这个类必须继承declarative_base实例化的对象具体步骤为,从sqlalchemy.ext.declarative中导入declarative,实例化declarative将创建的数据库引擎作为参数传入实例化对象中,创建一个类控制该数据库中的表
from sqlalchemy import create_engine
from sqlalchemy import Column,Integer,String
from sqlalchemy.ext.declarative import declarative_base
USERNAME = 'root'
PASSWORD = 'root'
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'test'
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
engine = create_engine(DB_URL)
# ORM操作数据库
Base = declarative_base(engine)
# 要使用ORM操作数据库都要declarative_base生成的基类
class Teacher(Base):
# 定义表的名字
__tablename__ = 'teacher'
# 给一些字段 id name gender,
# column 数据类型、数据的约束
id = Column(Integer,primary_key=True,autoincrement=True)
name = Column(String(50),nullable=False)
gender = Column(Integer,default=1,comment='1为男,2为女')
# 模型映射到数据库中
Base.metadata.create_all()