0%

在Flask中使用SQLAlchemy

在Flask中使用SQLAlchemy操作数据库。

安装 flask-sqlalchemy

1
$ pip install flask
1
$ pip install flask-sqlalchemy

基础

你所有模型的基类叫做 db.Model 。它存储在你必须创建的 SQLAlchemy 实例上。

在 Flask-sqlalchemy中,表名已自动设置好,除非自己重载它:eg:

1
__tablename__ = 'students' #指定表名

Column类型
类型名 Python 类型 说明
Integer int 整数
String(size) str 有最大长度的字符串
Text str 长 unicode 文本
Float float 存储浮点值
Boolean bool 存储布尔值
Date datetime.date 日期
Time datetime.time 时间
DateTime datetime.datetime 日期和时间
PickleType 任何python对象 存储一个持久化 Python 对象
LargeBinary str 存储任意大的二进制数据
常用字段
选项名 说明 示例
primary_key 设置主键 primary_key=True
unique 是否唯一 unique=True
index 是否创建索引 index=True
nullable 是否允许为空 nullable=True
default 设置默认值 default=datetime.datetime.utcnow

更详细的配置可参考 Flask Web Development —— 数据库(上) - young - SegmentFault


连接URI格式
1
dialect+driver://username:password@host:port/database
  • Mysql mysql://scott:tiger@localhost/mydatabase
  • Postgres postgresql://scott:tiger@localhost/mydatabase
  • SQLite sqlite:////absolute/path/to/foo.db
Flask-SQLAlchemy Sqlite连接路径问题
1
sqlite:////tmp/test.db

Sqlite连接字符串中的/斜杠说明:三斜杠为相对路径,四斜杠为绝对路径。

1
2
'sqlite:////tmp/test.db'                #表示指向绝对路径在Tmp目录的test.db文件
'sqlite:///Data/test.db' #表示指向相对路径在当前Py文件同目录的Data目录下test.db文件

Flask小记一:Flask-SQLAlchemy Sqlite连接路径问题 - 不折腾难受斯基


过滤器
过滤器 说明
filter 把过滤器添加到原查询上,返回一个新查询
filter_by 把等值过滤器添加到原查询上,返回一个新查询
limit 使用指定的值限制返回的结果数量,返回一个新查询
offset 便宜原查询返回的结果, 返回一个新查询
order_by 根据指定条件对原查询结果进行排序,返回一个新查询
group_by 根据指定条件对原查询结构进行分组,返回一个新查询
执行器
方法 说明
all 以列表形式返回查询的所有结果
first 返回查询的第一个结果,如果没有结果,则返回 None
first_or_404 返回查询的第一个结果,如果没有结果,则终止请求,返回 404 错误输出
get 返回指定主键对应的行,如果没有对应的行,则返回 None
get_or_404 返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回 404 错误输出
count 返回查询结果的数量
paginate 返回一个 Paginate 对象,它包含指定范围内的结果

简单示例

入门示例

参考自官方入门教程示例代码 Quickstart Flask-SQLAlchemy Documentation (2.1)

flsksql.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# coding:utf-8

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app=Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///test.db' # 连接当前项目同目录下的test.db数据库文件


app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True

db=SQLAlchemy(app)

class User(db.Model):
"""docstring for User"""
__tablename__='users'
id=db.Column(db.Integer,primary_key=True)
username=db.Column(db.String(80),unique=True)
email=db.Column(db.String(64),unique=True)

def __init__(self, username,email):
self.username=username
self.email=email

def __repr__(self):
return '<User %r>' % self.username

app.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# coding:utf-8

from flask import Flask
from flsksql import db
from flsksql import User

if __name__ == '__main__':

# 初始化数据库
# db.create_all()

# 新增
# user1=User('abc','abc@124.com')
# user2=User('def','def@129.com')
# db.session.add(user1)
# db.session.add(user2)
# 使用commit提交更改
# db.session.commit()

# 查询所有数据信息
# users=User.query.all()
# print(users)

# 条件查询
# admin=User.query.filter_by(username='abc').first()
# print(admin)

# 模糊查询
# user2_query=User.query.filter(User.username.endswith('f')).first()
# print(user2_query)


# 删除
# u3=User.query.first()
# print(u3.username)
# db.session.delete(u3)
# db.session.commit()

# 更改
# u4=User.query.first()
# u4.username=u'专升本' # 中文必须为unicode类型,而不是str类型
# db.session.commit()

通过上下文的方式-init_app()
database.py–数据操作方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# coding:utf-8

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db=SQLAlchemy()

def create_app(config_name=None):
app=Flask(__name__)

# 在此处加载配置文件
if config_name is not None:
# app.config.from_object() # 默认的config.py
app.config.from_pyfile(config_name) # 通过配置文件名称加载配置文件

db.init_app(app)

# 在此处加载蓝图设置

with app.app_context():
# 添加数据对象的引用
from models import *
# 初始化数据库
db.create_all()

return app
models.py–Model实体
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# coding:utf-8

from database import db


class User(db.Model):
"""docstring for User"""
__tablename__='users'
id=db.Column(db.Integer,primary_key=True)
username=db.Column(db.String(80))
email=db.Column(db.String(64))

def __init__(self, username,email):
self.username=username
self.email=email


class Address(db.Model):
"""docstring for Address"""

id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(32))
def __init__(self, name):
self.name=name
config.py–sql配置文件
1
2
3
DEBUG=True
SQLALCHEMY_DATABASE_URI='sqlite:///testabc.db'
SQLALCHEMY_TRACK_MODIFICATIONS=True
app.py–项目
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# coding:utf-8

from flask import Flask
from database import db
from database import create_app
from models import User,Address

app=create_app('config.py')

@app.route('/')
def index():
# user1=User('aaa','aaa@124.com')
# user2=User(u'马云','mayun@111.com')
add1=Address('beijing motuoluola')
# db.session.add(user1)
db.session.add(add1)
db.session.commit()
return "create complate"

@app.route('/show')
def show():
u=User.query.filter(User.email.startswith('m')).first()
return u.username

if __name__ == '__main__':
app.run()
项目目录
1
2
3
4
5
6
flaskdemo
app.py
database.py
models.py
config.py
testabc.db
init_app() 相关参考

一对多、多对多关系

一对多

待完善。

多对多

待完善。


文中所用各类库版本

1
2
3
4
Flask==0.12
Flask-SQLAlchemy==2.1
Jinja2==2.8.1
SQLAlchemy==1.1.4

相关参考

如有疑问或需要技术讨论,请留言或发邮件到 service@itfanr.cc