安装
1
2
|
pip install flask–sqlalchemy
pip install MySQL–python
|
需要先安装mysql开发库的。
使用
创建SQLALchemy 对象, 然后再 绑定Flask
1
2
3
4
5
|
from flask_sqlalchemy import SQLALchemy
from flask import Flask
app = Flask(__name__)
db = SQLALchemy()
db.init_app(app)
|
指定SQLALchemy URI
1
|
app.config[‘SQLALCHEMY_DATABASE_URI’] = “mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>”
|
定义模型
使用 ORM 就肯定要定义对象的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class Users(db.Model):
__tablename__ = ‘users’
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String, unique=True)
username = db.Column(db.String, unique = True)
passwd = db.Column(db.String)
date = db.Column(db.DateTime)
class Users_detail(db.Model):
__tablename__ = ‘users_detail’
id = db.Column(db.Integer, primary_key=True)
uid = db.Column(db.Integer,unique=True)
age = db.Column(db.Integer)
sex = db.Column(db.SmallInteger)
location = db.Column(db.String)
intro = db.Column(db.Text)
todo = db.Column(db.Text)
modifytime = db.Column(db.DateTime)
inserttime = db.Column(db.DateTime)
|
从这两个例子可以看到,定义一列是需要使用 db.Column
的,然后需要指定数据类型,还有列的选项,常用的数据类型有:
类型名 | Python 类型 | 说明 |
---|---|---|
Integer | int | 普通整数,一般是32位 |
SmallInteger | int | 取值范围小的整数,一般是 16 位 |
BigInteger | int 或 long | 不限制精度的整数 |
Float | float | 浮点数 |
Numeric | decimal.Decimal | 定点数 |
String | str | 变长字符串 |
Text | str | 编程字符串,对较长或不限长度的字符串做了优化 |
Unicode | unicode | 变长 Unicode 字符串 |
UnicodeText | unicode | 变长 Unicode 字符串,对较长或不限长度的字符串做了优化 |
Boolean | bool | 布尔值 |
Date | datetime.date | 日期 |
Time | datetime.time | 时间 |
DateTime | datetime.datetime | 日期和时间 |
Interval | datetime.timedelta | 时间间隔 |
Enum | str | 一组字符串 |
PickleType | 任何 python 对象 | 自动使用 Pickle 序列化 |
LargeBinary | str | 二进制文件 |
而一些常用的 SQLAlchemy
列选项: 选项名 | 说明 |
---|---|
primary_key | 如果设为 True,这列就是表的主键 |
unique | 如果设为 True,这列不允许出现重复的值 |
index | 如果设为 True,为这列创建索引,提升查询效率 |
nullable | 如果设为 True,这列允许使用空值,如果设为 False,这列不允许使用空值 |
default | 为这列定义默认值 |
数据库操作
数据库的操作不外乎就是增删改查,所以这里就介绍一下增删改查怎么做,和其他 ORM(例如 MongoEngine
) 不一样,SQLAlchemy
使用之前需要先创建表和数据库才能操作数据。 所以第一步是创建表:
1
2
3
|
$ python app.py shell
>>> from app import db
>>> db.create_all()
|
插入数据
1
2
3
4
5
6
7
8
9
|
from app import db, Users, Users_detail
from datetime import datetime
user = User(email=‘ttlsa@ttlsa.com’,username=‘ttlsa’,passwd=‘ttlsa’,date=datetime.now())
user_detail = Users_detail(XXXXX) #自己补齐去吧
# 下面这个很重要
db.session.add(user)
db.session.add(user_detail)
db.session.commit()
|
这里需要提一下的就是 db.session
,这个 session
是数据库中 事务的含义,因此我们可以提交修改数据,也可以回滚取消修改。
修改数据
1
2
3
|
users = Users(username=“ttlsa2”)
db.session.add(user)
db.session.commit()
|
修改只需要修改属性并提交就行了。
删除数据
1
2
|
db.session.delete()
db.session.commit()
|
删除数据直接调用 delete 方法即可,记得 commit。
查询数据
查询数据稍微复杂一下
- 获得查询对象
- 添加过滤条件
- 如果还有其他分组之类的,继续添加
1
2
|
Users.query.all()
Users.query.filter_by(id=1)
|
这里的 filter_by 叫做过滤器,常用的过滤器有
过滤器 | 说明 |
---|---|
filter | 把过滤器添加到原查询上,返回一个新查询 |
filter_by | 把等值过滤器添加到原查询上,返回一个新查询 |
limit | 使用指定的值限制返回的结果数量,返回一个新查询 |
offset | 便宜原查询返回的结果, 返回一个新查询 |
order_by | 根据指定条件对原查询结果进行排序,返回一个新查询 |
group_by | 根据指定条件对原查询结构进行分组,返回一个新查询 |
如果后面不加.all(),那么其实是不会真正到数据库执行的,类似 all 的执行器还有很多,常用的有:
方法 | 说明 |
---|---|
all | 以列表形式返回查询的所有结果 |
first | 返回查询的第一个结果,如果没有结果,则返回 None |
first_or_404 | 返回查询的第一个结果,如果没有结果,则终止请求,返回 404 错误输出 |
get | 返回指定主键对应的行,如果没有对应的行,则返回 None |
get_or_404 | 返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回 404 错误输出 |
count | 返回查询结果的数量 |
paginate | 返回一个 Paginate 对象,它包含指定范围内的结果 |
文章转载来自:ttlsa.com