flask中一般使用flask-sqlalchemy来操作数据库,使用起来比较简单,易于操作。
安装
pipenv install flask-sqlalchemy pipenv install pymsql#驱动
配置
配置选项 | 说明 |
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文件里面,配置在创建引擎前需写好,不要在程序运行时修改配置,如下。
DEBUG = True SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:root@localhost:3306/fisher"
写完数据库配置后需要和app绑定,app.py文件里写flask应用的创建和蓝图的注册等等,如下:
from flask import Flask import configsfrom exts import db app = Flask(__name__) # 加载配置文件 app.config.from_object(configs) # db绑定 appdb.init_app(app)
表与表之间的关联
""" 以下表关系: 一个用户对应多篇文章(一对多) 一篇文章对应多个标签,一个标签对应多个文章(多对多) """ """ 一对一关系中,需要设置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) #根据User表的id关联文章 user=relationship('User') 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))
创建表
# 初始化Flask def create_app(): app = Flask(__name__) # 导入配置模块 app.config.from_object('app.config.config') register_blueprint(app) db.init_app(app) db.create_all(app=app) return app
表的增删查改
# 原生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'})
from flask_sqlalchemy import SQLAlchemy # 实例化 db = SQLAlchemy() class Base(db.Model): #表示不创建这个表 __abstract__ = True pass
密码自动加密
from sqlalchemy import Column, Integer, String from werkzeug.security import generate_password_hash from app.models.base import Base class User(Base): id = Column(Integer, primary_key=True, autoincrement=True) user_name = Column(String(50), unique=True) email = Column(String(50), nullable=True, unique=True) _password = Column('password', String(64), nullable=True) # 读取属性 @property def password(self): return self._password # 设置password并且加密 @password.setter def password(self, val): self._password = generate_password_hash(val)
根据前端传递的字段自动为对象赋值
from flask_sqlalchemy import SQLAlchemy # 实例化 db = SQLAlchemy() class Base(db.Model): # 表示不创建这个表 __abstract__ = True def set_attrs(self, attr_dict): for key, value in attr_dict.items(): # hasattr是python自带的判断对象是否存在某个属性 if hasattr(self, key) and key != 'id': setattr(self, key, value)
使用:
@web.route('/register', methods=['POST', 'GET']) def register(): form = RegisterForm(request.form) if request.method == 'POST' and form.validate(): #获取到User模型实例 user=User() #然后自动根据传递的数据返回数据库需要的字段 user.set_attrs(form.data) #添加一条记录 db.session.add(user) #提交 db.session.commit() pass return render_template('user/register.html',form={'data':{}})
发表评论
侧栏公告
寄语
譬如朝露博客是一个分享前端知识的网站,联系方式11523518。
热评文章
标签列表
热门文章
友情链接