Flask-SQLAlchemy 使用起来非常有趣,对于基本应用十分容易使用,并且对于大型项目易于扩展。
官方文档:https://flask-sqlalchemy.palletsprojects.com/en/2.x/
中文文档:http://www.pythondoc.com/flask-sqlalchemy/
安装
pip install flask-sqlalchemy
配置
配置选项 | 说明 |
SQLALCHEMY_DATABASE_URI |
连接数据库。示例:mysql://username:password@host/post/db?charset=utf-8 |
SQLALCHEMY_BINDS |
一个将会绑定多种数据库的字典。 更多详细信息请看官文 绑定多种数据库. |
|
调试设置为true |
|
数据库池的大小,默认值为5。 |
|
连接超时时间 |
SQLALCHEMY_POOL_RECYCLE |
自动回收连接的秒数。 |
SQLALCHEMY_MAX_OVERFLOW |
控制在连接池达到最大值后可以创建的连接数。当这些额外的连接回收到连接池后将会被断开和抛弃。 |
|
如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。 |
创建及查询
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:tmp/test.db' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) email = db.Column(db.String(120), unique=True) def __init__(self, username, email): self.username = username self.email = email def __repr__(self): return '<User %r>' % self.username if __name__ == '__main__': # 创建初始数据 db.create_all() # 创建一些用户 admin = User('admin', 'admin@example.com') guest = User('guest', 'guest@example.com') # 写入到数据库 db.session.add(admin) db.session.add(guest) db.session.commit() # 访问数据库 users = User.query.all() admin = User.query.filter_by(username='admin').first() print(users) print(admin)
结果:
[<User 'admin'>, <User 'guest'>] <User 'admin'>
表关联
SQLAlchemy 连接到关系型数据库,关系型数据最擅长的东西就是关联。因此,我们将创建一个使用两张相互关联的表的应用作为例子:
from flask import Flask from flask_sqlalchemy import SQLAlchemy from datetime import datetime app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:tmp/test.db' db = SQLAlchemy(app) class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(80), nullable=False) body = db.Column(db.Text, nullable=False) pub_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) category_id = db.Column(db.Integer, db.ForeignKey('category.id'), # 外键 nullable=False) # 与生成表结构无关,仅用于查询方便 # backref 标示可通过relationship反向查找,Category.posts查询Post表数据 category = db.relationship('Category', backref=db.backref('posts', lazy=True)) def __repr__(self): return '<Post %r>' % self.title class Category(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), nullable=False) def __repr__(self): return '<Category %r>' % self.name if __name__ == '__main__': # 创建一些对象 py = Category(name='Python') Post(title='Hello Python!', body='Python is pretty cool', category=py) p = Post(title='Snakes', body='Ssssssss') py.posts.append(p) db.session.add(py) # 现在因为我们在 backref 中声明了 posts 作为动态关系,查询显示为: print(py.posts)
运行结果:
[<Post 'Hello Python!'>, <Post 'Snakes'>]更多数据库的增删改查等功能参考官方文档:https://flask-sqlalchemy.palletsprojects.com/en/2.x/queries/