数据库
网页自然是少不了数据库保存信息,而比较常用的则是SQL关系式数据库,由此,flask-sqlalchemy插件诞生。
flask只提供基础,其它部分比如数据库就交给强大的扩展完成,现在开始吧。
安装
安装还是简单的pip:
pip install flask-sqlalchemy
开始
# app.py
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///user.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = "user"
id = db.Column("user_id", db.Integer, primary_key=True)
username = db.Column(db.String(100), unique=True)
password = db.Column(db.String(100))
def __init__(self, username, password):
self.username = username
self.password = password
def __repr__(self):
return self.username
if __name__ == "__main__":
app.run(debug=True)
首先引入flask-sqlalchemy模块,然后使用app对象创建一个数据库,注意这里的两个配置:
- SQLALCHEMY_DATABASE_URL:这就是数据库的地址,我们可以使用sqlite:///来进行本地数据库的创建。
- SQLALCHEMY_TRACK_MODIFICATIONS:这时sqlalchemy的跟踪对象修改,最好禁止以提升效率。
我们再来看看数据库的创建,这里的Integer和String等都是这个项的类型,总共是这些:
- Integer:整数
- String(size):字符串,并可以设置它的最大长度
- Text:unicode文本
- DateTime:通过datetime模块来表示时间日期
- Float:浮点数
- Boolean:布尔值
- PickleType:存储一个pickle对象
- LargeBinary:二进制数据
然后,为了方便测试,我们在命令行引入,进行测试,注释已标明:
>>> from app import db, User # 引入数据库对象
>>> db.create_all() # 创建数据库
>>> jack = User("Jack", "flask") # 创建一个User对象
>>> db.session.add(jack) # 加入这个User对象
>>> db.session.commit() # 提交修改
>>> tom = User("Tom", "python3")
>>> alice = User("Alice", "python") # 再创建两个User对象
>>> db.session.add(tom)
>>> db.session.add(alice)
>>> db.session.commit() # 一样的操作
>>> User.query.all() # 获取数据库中所有数据
[Jack, Tom, Alice]
>>> alice = User.query.filter_by(username="Alice").first() # 找到username为Alice的对象
>>> alice.id, alice.username, alice.password # 得到它的数据
(3, 'Alice', 'python')
>>> User.query.filter(User.password.startswith("python")).all() # 得到密码以python起头的对象
[Tom, Alice]
>>> User.query.order_by(User.username).all() # 以用户名排序
[Alice, Jack, Tom]
>>> User.query.limit(1).all() # 限制得到一个对象
[Jack]
>>> User.query.get(1) # 获取id为1的对象
Jack
>>> db.session.delete(alice) # 删除alice用户
>>> db.session.commit() # 提交修改
这样懂了吗?
多数据库
当然,我们一个应用可能不止一个数据库,那怎么区分了,这时候就需要用到bind_key:
class Database1(db.Model):
pass
class Database2(db.Model):
__bind_key__ = "database2"
db.create_all()
db.create_all(bind="database2")