Flask 学习笔记
一、SQLAlchemy 介绍
数据库是一个网站的基础。Flask 可以使用很多种数据库。比如 MySQL, MongoDB,SQLite,PostgreSQL 等。而在 Flask 中,如果想要操作数据库,我们可以使用 ORM 来操作数据库,使用 ORM 操作数据库将变得非常简单。
在 Flask 中操作数据库之前(以 MySQL 为例),先要安装这些模块:
-
mysql:如果是在 windows 上,到官网下载。如果是 Ubuntu,通过命令
sudo apt-get install mysql-server libmysqlclient-dev -yq
进行下载安装。 -
pymysql:pymysql 是用 Python 来操作 mysql 的包,因此通过
pip
来安装,命令如下:pip install pymysql
。 -
SQLAlchemy:SQLAlchemy 是一个数据库的 ORM 框架,我们在后面会用到。也是通过
pip
来安装:pip install SQLAlchemy
。
二、SQLAlchemy 的使用
2.1、通过 SQLAlchemy 连接数据库
首先从 sqlalchemy 中导入 create_engine
,用这个函数来创建引擎,然后用 connect()
来连接数据库。其中比较重要的一点是,通过 create_engine 创建引擎的时候,需要传递一个满足某种格式的字符串:
# 什么数据库+相应的数据库引擎://账号:密码@数据库地址:端口/数据库名称?编码类型
dialect+driver://username:password@host:port/database?charset=utf8
-
dialect
:是数据库的实现,比如 MySQL、PostgreSQL、SQLite,并且转换成小写。 -
driver
:是 Python 对应的驱动,如果不指定,会选择默认的驱动,比如 MySQL 的默认驱动是 MySQLdb。 -
username
:是连接数据库的用户名。 -
password
:是连接数据库的密码。 -
host
:是连接数据库的域名。 -
port
:是数据库监听的端口号。 -
database
:是连接哪个数据库的名字。
from sqlalchemy import create_engine
# 连接数据库所需的参数
HOSTNAME = "127.0.0.1"
PORT = 3306
DATABASE = "dvwa"
USERNAME = "root"
PASSWORD = "root"
# 创建数据库引擎
DB_URL = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
engine = create_engine(DB_URL)
# 创建连接
conn = engine.connect()
# 查询 users 表
result = conn.execute("select * from users")
# 输出第一条记录
print(result.fetchone())
这里可能会报一个警告
Warning: (1366, "Incorrect string value: '\\xD6\\xD0\\xB9\\xFA\\xB1\\xEA...' for column 'VARIABLE_VALUE' at row 485")
这是因为在最新的 flask 里,官方建议使用 mysql-connector
,所以想解决这个警告只需安装下这个包,然后如下使用即可:
DB_URL2 = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
2.2、用 SQLAlchemy 执行原生 SQL
# 使用 with 语句连接数据库,如果发生异常会被捕获
with engine.connect() as conn:
# 创建一个 authors 表,有自增长的 id 和 name
conn.execute('create table authors(id int primary key auto_increment, name varchar(25))')
# 插入两条数据到表中
conn.execute('insert into authors(name) values("abc")')
conn.execute('insert into authors(name) values("老王")')
# 执行查询操作
results = conn.execute('select * from authors')
# 从查找的结果中遍历
for result in results:
print(result)
# 先删除 authors 表
# conn.execute('drop table if exists authors')