flask中一般使用flask-sqlalchemy来操作数据库,使用起来比较简单,易于操作。
安装
pip install flask-sqlalchemy 配置
配置选项 说明 SQLALCHEMY_DATABASE_URI 连接数据库。示例:mysql://username:password@host/post/db?charset=utf-8 SQLALCHEMY_BINDS 一个将会绑定多种数据库的字典。 更多详细信息请看官文 绑定多种数据库. SQLALCHEMY_ECHO 调试设置为true SQLALCHEMY_POOL_SIZE 数据库池的大小,默认值为5。 SQLALCHEMY_POOL_TIMEOUT 连接超时时间 SQLALCHEMY_POOL_RECYCLE 自动回收连接的秒数。 SQLALCHEMY_MAX_OVERFLOW 控制在连接池达到最大值后可以创建的连接数。当这些额外的 连接回收到连接池后将会被断开和抛弃。 SQLALCHEMY_TRACK_MODIFICATIONS 如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。 操作数据库需要先创建一个db对象,通常写在exts.py文件里。
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy() flask项目一般将数据库配置写入configs.py文件里面,配置在创建引擎前需写好,不要在程序运行时修改配置,如下。
HOST = '127.0.0.1' PORT = '3306' DATABASE = 'flask1' USERNAME = 'root' PASSWORD = '123456'
DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD, host=HOST,port=PORT, db=DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_ECHO = True 写完数据库配置后需要和app绑定,app.py文件里写flask应用的创建和蓝图的注册等等,如下:
from flask import Flask import configs from exts import db
app = Flask(name)
加载配置文件
app.config.from_object(configs)
db绑定app
db.init_app(app) 模型
数据类型 说明 Integer 整型 String 字符串 Text 文本 DateTime 日期 Float 浮点型 Boolean 布尔值 PickleType 存储一个序列化( Pickle )后的Python对象 LargeBinary 巨长度二进制数据 1.表的创建
建表写在models.py文件里面
from ext import db
""" 以下表关系: 一个用户对应多篇文章(一对多) 一篇文章对应多个标签,一个标签对应多个文章(多对多) """ """ 一对一关系中,需要设置relationship中的uselist=Flase,其他数据库操作一样。 一对多关系中,外键设置在多的一方中,关系(relationship)可设置在任意一方。 多对多关系中,需建立关系表,设置 secondary=关系表 """
用户表
class User(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(50)) email = db.Column(db.String(50))
关系表(多对多)
article_tag_table = db.Table('article_tag', db.Column('article_id', db.Integer, db.ForeignKey('article.id'), primary_key=True), db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True))
文章表
class Article(db.Model): tablename = 'article' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100)) content = db.Column(db.Text) author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
author = db.relationship("User", backref="articles")
tags = db.relationship("Tag", secondary=article_tag_table, backref='tags')
标签表
class Tag(db.Model): tablename = 'tag' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(50))
2.表的映射
创建好表后需要映射到数据库中,这里需要用到flask-migrate库。下面是启动文件manage.py。
from flask_script import Manager, Server from app import app from flask_migrate import Migrate, MigrateCommand from ext import db from first import models # 模型文件必须导入进来,否则运行报错
manager = Manager(app) Migrate(app=app, db=db) manager.add_command('db', MigrateCommand) # 创建数据库映射命令 manager.add_command('start', Server(port=8000, use_debugger=True)) # 创建启动命令
if name == 'main': manager.run() 配置好启动文件后,进入项目根目录,在命令行输入以下代码:
python manage.py db init python manage.py db migrate python manage.py db upgrade 3.表的增删查改
原生sql语句操作
sql = 'select * from user' result = db.session.execute(sql)
查询全部
User.query.all()
主键查询
User.query.get(1)
条件查询
User.query.filter_by(User.username='name')
多条件查询
from sqlalchemy import and_ User.query.filter_by(and_(User.username =='name',User.password=='passwd'))
比较查询
User.query.filter(User.id.lt(5)) # 小于5 User.query.filter(User.id.le(5)) # 小于等于5 User.query.filter(User.id.gt(5)) # 大于5 User.query.filter(User.id.ge(5)) # 大于等于5
in查询
User.query.filter(User.username.in_('A','B','C','D'))
排序
User.query.order_by('age') # 按年龄排序,默认升序,在前面加-号为降序'-age'
限制查询
User.query.filter(age=18).offset(2).limit(3) # 跳过二条开始查询,限制输出3条
增加
use = User(id,username,password) db.session.add(use) db.session.commit()
删除
User.query.filter_by(User.username='name').delete()
修改
User.query.filter_by(User.username='name').update({'password':'newdata'})