python大佬养成计划----flask_sqlalchemy操作数据库
flask_sqlalchemy
使用对象关系映射(Object-Relational Mapper, ORM)框架,它将低层的数据库操作指令抽象成高层的面向对象操作。也就是说,如果我们直接使用数据库引擎,我们就要写 SQL 操作语句,但是,如果我们使用了 ORM 框架,我们对诸如表、文档此类的数据库实体就可以简化成对 Python 对象的操作
SQLAlchemy已经成为了python世界里面orm的标准,flask是一个轻巧的web框架,可以自由的使用orm,其中flask-sqlalchemy是专门为flask指定的插件。
在 Flask-SQLAlchemy 中,数据库使用 URL 指定。
MySQL --> mysql://username:password@hostname/database
安装
pip install flask-sqlalchemy
对数据库操作
1. 如何创建数据库操作连接
from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
db = SQLAlchemy(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:sheen@localhost/zaj_sql'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Trueclass 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)
为了创建初始数据库,调用 SQLAlchemy.create_all() 方法来创建表和数据库:
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()
2.创建关系型数据库表
SQLAlchemy 连接到关系型数据库,关系型数据最擅长的东西就是关系。因此,我们将创建一个使用两张相互关联的表的应用作为例子。
最为常见的关系就是一对多的关系。因为关系在它们建立之前就已经声明,您可以使用 字符串来指代还没有创建的类
关系使用 relationship() 函数表示。然而外键必须用类 sqlalchemy.schema.ForeignKey 来单独声明.
from datetime import datetime
from flask_bootstrap import Bootstrap
from flask_wtf import FlaskForm
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
import pymysql
from sqlalchemy import descapp = Flask(__name__)
db = SQLAlchemy(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:sheen@localhost/zaj_sql'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
bootstrap = Bootstrap(app)class User(db.Model):id = db.Column(db.Integer,autoincrement=True,primary_key=True)name = db.Column(db.String(50),unique=True)passwd = db.Column(db.String(100))add_time = db.Column(db.DATETIME,default=datetime.now())gender = db.Column(db.BOOLEAN,default=True)role_id = db.Column(db.INTEGER,db.ForeignKey('role.id'))def __repr__(self):return '<User:%s>' %(self.name)class Role(db.Model):id = db.Column(db.INTEGER,autoincrement=True,primary_key=True)name = db.Column(db.String(50),unique=True)users = db.relationship('User',backref='role')# 给Role模型添加users属性# backref 是定义反向引用def __repr__(self):return '<Role:%s>' % (self.name)
if __name__ =='__main__':# 1. 创建数据库表# db.drop_all()# db.create_all()# # 2. 创建role数据库表数据role_1 = Role(name='超级会员')role_2 = Role(name='普通会员')db.session.add(role_1)db.session.add(role_2)db.session.commit()# # # 3. 添加user表内数据,100个用户,50个为超级会员,50个为普通会员for i in range(1,13):if i%2 == 0:u = User(name='sheen'+str(i),passwd='sheen',role_id=1)db.session.add(u)else:u = User(name='star'+str(i),passwd='star',role_id=2)db.session.add(u)db.session.commit()
backref 是定义反向引用,可以通过User.role访问Role对象和属性。
查询所有数据
print('角色',Role.query.all())print('用户',User.query.all())
根据条件查询数据
# select * from tablename where xxx=xxxxxprint(User.query.filter_by(role_id=1).all())print(Role.query.filter_by().all())print(User.query.filter_by(role_id=2).all())
对于找到的数据进行更新
print('进行数据更新',end='\n')u =User.query.filter_by(name='sheen2').first()print(u)u.passwd = '123'db.session.add(u)db.session.commit()
筛选数据方法2(filter),这种方法可以看见原生的sql语句
print('数据筛选', end='\n')user = User.query.filter(User.role_id==1)print(user)
对于查询的信息进行显示限制
print('限制查询数据的显示', end='\n')users = User.query.filter_by(role_id=1).limit(3).all()print(users)
对于查询的信息进行排序输出(默认情况由小到大进行排序), 如果想要由大到小: desc(User.add_time)
print('数据再处理', end='\n')users = User.query.filter_by(role_id=1).order_by(desc(User.name)).all()print(users)
多个过滤函数
print('多个过滤函数', end='\n')users = User.query.filter_by(role_id=1).order_by(desc(User.name)).limit(3).offset(1).all()print(users)users = User.query.filter_by(role_id=1).order_by(desc(User.name)).slice(1,4).all()print(users)
分页,第一个参数表示显示第几页数据,第二个参数表示每页显示多少条数据
print('分页显示', end='\n')users = User.query.paginate(1,5)print(users.items)users = User.query.paginate(2, 5)print(users.items)
python大佬养成计划----flask_sqlalchemy操作数据库相关推荐
- python大佬养成计划-----多进程
进程 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优势.而使用多进程(Multiprocess),则可以 ...
- python大佬养成计划----HTML网页设计二
文本标签 换行标签 -- br 是单标签,意味着它没有结束标签.起强制换行作用 段落中的文字<br>段落中的文字<br>段落中的文字<br> 水平分割线 -- hr ...
- python大佬养成计划----HTML网页设计一
HTML简介 级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准. 它通过标记符号来标记要显示的网页中的各个部分.网页文件本身是一种文本文件,通过在文本文件中添加标记符,可以告诉浏览 ...
- python大佬养成计划--协程实现TCP连接
协程实现TCP连接 在网络通信中,每个连接都必须创建新线程(或进程) 来处理,否则,单线程在处理连接的过程中, 无法接受其他客户端的连接.所以我们尝试使用协程来实现服务器对多个客户端的响应. 与单一T ...
- pythondjango图书_python大佬养成计划----Django图书人物适配系统(后台)
Django Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架,由Pyt ...
- python操作windows库_python大佬养成计划----win下对数据库的操作
数据库 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. win系统安装mysql,详见链接描述 数据库常见命令 mysql ...
- python太阳花的编程_python大佬养成计划----HTML DOM
什么是DOM? DOM (Document Object Model) 译为文档对象模型,是 HTML 和 XML 文档的编程接口. HTML DOM 定义了访问和操作 HTML 文档的标准方法. D ...
- python网页优化_python大佬养成计划----JavaScript对html的优化
切换图片 当我们浏览网页时,时常出现图片轮播场景.实现用鼠标点击'下一页'时,更换图片的功能. #当前目录下建立img目录,存放图片,图片命名格式'img1.jpg' 图片切换 #snow_maps{ ...
- python中登录、注册操作数据库
# 1.注册.登录# 1.注册的时候存账户密码到数据库里面,密码存密文,要加盐# 2.登录的时候账号.密码从数据里面取,登录失败一次,错误次数 + 1,错误次数大于3不让登录# 1.建表 id,use ...
最新文章
- LeetCode简单题之重新排列数组
- SAP WM Storage Type Search配置里的Storage Class WPC标记
- AI会让人类失业吗? 马云马化腾们不这么认为
- ThinkPHP如何判断一个更新操作是否成功
- 洛谷 P1024 一元三次方程求解
- linux 配置EPEL源
- DateFormat(炸窝)
- 有了它,从此走上炫酷的编码之路!
- 杭州微念申请李子柒商标被全部驳回,“最惨打工人”李子柒开始反击:已起诉!...
- web调试:ie缓存
- matplotlib使用参考地址
- Python3爬取妹子图——爬虫下载网络图片
- 2022显卡、CPU天梯图
- RestClient
- 数字信号处理经典书籍
- Couldn‘t find executable named person_subscriber below /home/yue/catkin_ws/src/... 找不到可执行文件的原因
- Win10系统无法使用VGAPlayer软件播放asf格式和VGA文件
- 使用RNN构建机器翻译模型
- 廊坊金彩教育:店铺标题怎么写
- 10款堪称神器的免费电脑软件推荐
热门文章
- 这样就能用MathType编辑^符号
- Storm构建分布式实时处理应用初探(转)
- 官方翻译不当导致的PowerShell运行失败一例
- 项目CPU异常高分析
- 为什么不应该使用“volatile”类型
- 框架中解决部分页面返回登录
- 如何处理“已超出域所允许创建计算机账户的最大值”
- ubuntu20.04 中ifconfig无ens33
- python numpy 数据类型为python对象-python numPy模块 与numpy里的数据类型、数据类型对象dtype...
- python神经网络风格_[Deep-Learning-with-Python]使用LSTM生成尼采风格文章