当前位置:网站首页>flask框架初学-06-对数据库的增删改查
flask框架初学-06-对数据库的增删改查
2022-08-04 01:30:00 【流墨馨】
上一节学习了怎么在flask中连接数据库,使得flask中的模型类可以与数据库中的表和字段一一映射。本节将具体介绍如果通过对模型对象进行操作,从而实现对数据库进行操作。
小知识点:
CDN:内容分发网络,构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡'内容分发'、调度等功能模块,使用户就近截取 所需内容,调高用户访问响应速度和命中率
一、查询
1、模型类.query.filter_by 简单查询
查询 | 模型类操作 | 对应数据库语句 |
---|---|---|
查询所有 | 模型类.query.all | select * from user; |
查询一个 | 模型类.query.get() | |
有条件的查询 | 模型类.query.filter_by(字段名 = 值) | select * from user where 字段名=值 |
模型类.query.filter_by(字段名 = 值).firdst() | select * from user where 字段名=值 limit 0,1 |
除了模型类.query.filter_by(),还有一种模型类.query.filter()的查询方式,两者不同的地方在于:
- 模型类.query.filter() 里面是一个布尔的条件 模型类.query.filter(模型名.字段名 == 值)
- 模型类.query.filter_by() 里面是一个等值 模型类.query.filter_by(字段名 = 值)
2、模型类.query.filter()
简单查询
查询 | 模型类操作 | 对应数据库语句 |
---|---|---|
查询所有,返回一个列表 | 模型类.query.filter.all() | select * from user; |
查询所有结果的第一个,返回一个对象 | 模型类.query.filter.first() | select * from user where 字段名=值 |
模糊查询
查询 | 模型类操作 | 对应数据库语句 |
---|---|---|
查询User中以t结尾的数据 | User.query.filter(User.username.endswith(‘t’)).all() | select * from User where username like ‘%t’; |
查询User中以t开头的数据 | User.query.filter(User.username.startswith(‘t’)).all() | select * from User where username like ‘t%’; |
查询User中包含t的数据 | User.query.filter(User.username.contains(‘t’)).all() | select * from User where username like ‘%t%’; |
查询User中包含t的数据 | User.query.filter(User.username.like(‘%t%’)).all() | select * from User where username like ‘%t%’; |
多条件判断查询 :需要先导入sqlalchemy
from sqlalchemy import or_, and_, not_, __gt__,__lt__,__ge__(gt equal),__le__(le equal)
查询 | 模型类操作 | 对应数据库语句 |
---|---|---|
查询User中username以t结尾或者包含i的所有数据 | User.query.filter(or_(User.username.like(‘t%’),User.username.contains(‘i’))).all() | select * from User where username like ‘%t’ or username like '%i%; |
查询User中username包含i并且rdatetine>2021-12-15 00:00:00的所有数据 | User.query.filter(and_(User.rdatetime. __ gt __ (‘2021-12-15 00:00:00’), User.username.contains(‘i’))).all() | select * from User where username like '%i% and rdatetime>‘2021-12-15 00:00:00’; |
查询User中phone为18176641567的所有数据 | User.query.filter(User.phone.in_([‘18176641567’,‘’,‘’])).all() | seslect * from User where phone in (‘18179641567’,‘’,‘’); |
如果要检索的字段是字符串 (varchar, db.String) :
User.username.startswith('')
User.username.endswith('')
User.username.contains('')
User.username.like('')
User.username.in_(['','',''])
User.username == 'zzz'
如果要检索的字段是整型或者日期:
User,age.__lt__(18)
User.rdatetime.__gt__('')
User.age.__le__(18)
User.age.__ge__(18)
User.age.between(15,30)
如果多个条件一起检索:
and_
or_
not_
排序 :order_by
查询 | 模型类操作 | 对应数据库语句 |
---|---|---|
查询User中所有数据并进行倒序返回 | User.query.order_by(-User.id).all() | select * from user desc; |
查询User中包含i的所有数据并根据rdatetime正序返回 | User.query.filter(User.username.contains(‘i’)).order_by(‘rdatetime’).all() | select * from user where username like '%i% order by rdatetime; |
查询User中包含i的所有数据并根据rdatetime倒序返回 | User.query.filter(User.username.contains(‘i’)).order_by(-User.rdatetime).all() | select * from user where username like '%i% order by rdatetime desc; |
限制:limit
查询 | 模型类操作 | 对应数据库语句 |
---|---|---|
查询User中根据id正序的前两条数据 | User.query.order_by(‘id’).limit(2).all() | select * from User order by id limit 2; |
跳过前两条记录再获取User中的两条记录 | User.query.offset(2).limit(2).all() | select * from User order by id limit 2,4 ; |
二、删除
1、逻辑删除(定义数据库中的表的时候,添加一个字段isdelete,通过此字段控制是否删除)
id = request.args.get('id')
user = User.query.get(id)
user.isdelete = True
db.session.commit()
2、物理删除
id = request.args.get('id')
user = User.query.get(id)
db.session.delete(user)
db.session.commit()
三、更新
id = request.args.get('id')
username = request.args.get('username')
phone = request.args.get('phone')
user = User.query.get(id)
user.phone = phone
user.username = username
db.session.commit()
四、添加
user = User()
user.xxx = xxx
db.session.add(user)
db.session.commit()
五、Example
项目结构
settings.py
class Config:
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'mysql://root:[email protected]:3306/flaskday06'
SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_ECHO = True
class DevelopmentConfig(Config):
ENV = 'development'
DEBUG = True
class ProductionConfig(Config):
ENV = 'production'
DEBUG = True
apps下的__ init __.py
from flask import Flask
import settings
from apps.user.view import user_bp
from ext import db
def create_app():
app = Flask(__name__,template_folder='../templates',static_folder='../static')
app.config.from_object(settings.DevelopmentConfig)
# 初始化db
db.init_app(app)
app.register_blueprint(user_bp)
return app
ext下的__ init __.py
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()
db = SQLAlchemy()
app.py
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
from apps.user.models import User
from apps import create_app
from ext import db
app = create_app()
manager = Manager(app = app)
migrate = Migrate(app = app, db = db)
manager.add_command('db',MigrateCommand)
@manager.command
def init():
print('初始化')
if __name__ == '__main__':
manager.run()
models.py
from datetime import datetime
from ext import db
class User(db.Model):
id = db.Column(db.Integer,primary_key = True,autoincrement = True)
username = db.Column(db.String(15),unique=True,nullable=False)
password = db.Column(db.String(64),nullable=False)
phone = db.Column(db.String(11),nullable=False,unique= True)
isdelete = db.Column(db.Boolean,default=False)
rdatetime = db.Column(db.DateTime,default = datetime.now())
def __str__(self):
return self.username
view.py
import hashlib
from flask import Blueprint, request, render_template, url_for
from sqlalchemy import or_, and_, not_
from werkzeug.utils import redirect
from apps.user.models import User
from ext import db
user_bp = Blueprint('user',__name__)
# 注册
@user_bp.route('/register',methods=['POST','GET'])
def register():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
repassword = request.form.get('repassword')
phone = request.form.get('phone')
if password == repassword:
user = User()
user.username = username
user.password = hashlib.md5(password.encode('utf-8')).hexdigest()
user.phone = phone
db.session.add(user)
db.session.commit()
return redirect(url_for('user.user_center'))
return render_template('user/register.html',msg='用户确认密码不正确!')
return render_template('user/register.html')
# 用户中心
@user_bp.route('/')
def user_center():
users = User.query.filter(User.isdelete == False).all()
return render_template('user/center.html',users = users)
# 登录
@user_bp.route('/login')
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
new_password = hashlib.md5(password.encode('utf-8')).hexdigest()
user_list = User.query.filter_by(username=username)
print(user_list)
for u in user_list:
if u.password == new_password:
return '用户登录成功!'
else:
return render_template('user/login.html',msg='用户名或密码有误!')
print(u)
return 'testing'
return render_template('user/login.html')
# 检索
@user_bp.route('/search')
def search():
keyword = request.args.get('search')
# 查询
user_list = User.query.filter(or_(User.username.contains(keyword),User.phone.contains(keyword)))
return render_template('user/center.html',users=user_list)
# 删除
@user_bp.route('/delete',endpoint='delete')
def user_delete():
id = request.args.get('id')
# 获取该id的用户
user = User.query.get(id)
# 1、逻辑删除
user.isdelete = True
""" # 2、物理删除 db.session.delete(user) """
# 提交
db.session.commit()
return redirect(url_for('user.user_center'))
# 更新
@user_bp.route('/update',endpoint='update',methods=['GET','POST'])
def user_update():
if request.method == 'POST':
id = request.form.get('id')
username = request.form.get('username')
phone = request.form.get('phone')
user = User.query.get(id)
user.phone = phone
user.username = username
db.session.commit()
return redirect(url_for('user.user_center'))
else:
id = request.args.get('id')
user = User.query.get(id)
return render_template('user/update.html',user=user)
@user_bp.route('/test')
def test():
username = request.args.get('username')
user = User.query.filter_by(username=username).first()
print(user.username,user.rdatatime)
user = User.query.filter_by(username=username).last()
print(user.username, user.rdatatime)
return 'test'
@user_bp.route('/select')
def user_select():
# 根据主键查询用户
user = User.query.get(1)
user1 = User.query.filter(User.username == 'tom').all()
user2 = User.query.filter(User.username == 'tom').first()
# 相当于 select * from User where username like 't%';
user_list = User.query.filter(User.username.startswith('t')).all()
user_list2 = User.query.filter(User.username.like('%t%')).all()
user_list3 = User.query.filter(or_(User.username.like('t%'), User.username.contains('i'))).all()
user_list4 = User.query.filter(and_(User.rdatetime>'2021-12-15 00:00:00', User.username.contains('i'))).all()
user_list5= User.query.filter(and_(User.rdatetime.__gt__('2021-12-15 00:00:00'), User.username.contains('i'))).all()
user_list6 = User.query.filter(not_(User.username.contains('i'))).all()
user_list7 = User.query.filter(User.phone.in_(['18179641567','',''])).all()
user_list8= User.query.filter(User.rdatetime.between('2021-12-05 00:00:00','2021-12-15 23:00:00')).all()
user_list9 = User.query.order_by(-User.id).all()
user_list10 = User.query.filter(User.username.contains('i')).order_by('rdatetime').all()
user_list11 = User.query.filter(User.username.contains('i')).order_by(-User.rdatetime).all()
# limit的使用 + offset偏移
user_list12 = User.query.order_by('id').limit(2).all()
usee_list13 = User.query.offset(1).limit(2).all()
return render_template('user/select.html',user=user,user1=user1,user2=user2,user_list=user_list,
user_list2=user_list2,user_list3=user_list3,user_list4=user_list4,user_list5=user_list5,
user_list6=user_list6,user_list7=user_list7,user_list8=user_list8,user_list9=user_list9,
user_list10=user_list10,user_list11=user_list11,user_list12=user_list12,usee_list13=usee_list13)
center.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户中心</title>
<script crossorigin="anonymous" integrity="sha384-nrOSfDHtoPMzJHjVTdCopGqIqeYETSXhZDFyniQ8ZHcVy08QesyHcnOUpMpqnmWq" src="https://lib.baomitu.com/jquery/3.1.0/jquery.min.js"></script>
</head>
<body>
<div><a href="{
{ url_for('user.register') }}">注册</a> <a href="{
{ url_for('user.login') }}">登录</a> <a href="">退出</a> </div>
<div>
<h1>所有用户信息如下:</h1>
搜索: <input type="text" name="search" placeholder="输入用户名或手机号码"><input type="button" value="搜索" id="search">
<br>
{% if users %}
<table border="1" cellspacing="0" width="50%" >
<tr>
<td>序号</td>
<td>用户名</td>
<td>电话</td>
<td>注册时间</td>
<td>操作</td>
</tr>
{% for user in users %}
<tr>
<td>{
{ loop.index }}</td>
<td>{
{ user.username }}</td>
<td>{
{ user.phone }}</td>
<td>{
{ user.rdatetime }}</td>
<td>
<a href="{
{ url_for('user.update') }}?id={
{ user.id }}">更新</a>
<a href="{
{ url_for('user.delete') }}?id={
{ user.id }}">删除</a>
</td>
</tr>
{% endfor %}
</table>
{% else %}
<p style="color:red; font-size: 20px;">当前还没有任何用户,抓紧时间注册吧!!!</p>
{% endif %}
</div>
<script> $('#search').click(function(){
let content = $("input[name='search']").val(); <!-- alert(content);--> location.href = '{
{ url_for('user.search') }}?search='+content }) </script>
</body>
</html>
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<h1>用户注册</h1>
<form action='{
{ url_for("user.register") }}' method="POST">
<input type="text" name="username" placeholder="用户名"><br>
<input type="password" name="password" placeholder="密码"><br>
<input type="password" name="repassword" placeholder="确认密码"><br>
<input type="text" name="phone" placeholder="手机号码"><br>
<input type="submit" value="用户注册" >
</form>
</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<h1>用户登录</h1>
<p style="color:red">{
{ msg }}</p>
<form action='{
{ url_for("user.login") }}' method="POST">
<input type="text" name="username" placeholder="用户名"><br>
<input type="password" name="password" placeholder="密码"><br>
<input type="submit" value="用户登录" >
</form>
</body>
</html>
select.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
user-----{
{ user }}------{
{ user.username }}-------{
{ user.rdatetime }}
<br>
user1----{
{ user1 }}
<br>
user2-----{
{ user2 }}
<br>
user_list----{
{ user_list | length }}
<br>
user_list2-----{
{ user_list2 | length }}
<br>
user_list3-----{
{ user_list3 | length }}
<br>
user_list4-----{
{ user_list4 | length }}
<br>
user_list5-----{
{ user_list5 | length }}
<br>
user_list6------{
{ user_list6 | length }}
<br>
user_list7------{
{ user_list7 | length }}
<br>
user_list8------{
{ user_list8 | length }}
<br>
user_list9------{
{ user_list9 | length }}
<br>
user_list10-----{
{ user_list10 | length }}
<br>
user_list11------{
{ user_list11 | length }}
<br>
user_list12------{
{ user_list12 | length }}
<br>
user_list13------{
{ user_list13 | length }}
<br>
</body>
</html>
update.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户更新</title>
</head>
<body>
<h1>用户更新操作</h1>
<form action="{
{url_for('user.update')}}" method="post">
<input type="hidden" name="id" value="{
{ user.id }}">
<p><input type="text" name="username" value="{
{ user.username}}"> </p>
<p><input type="text" name="phone" value="{
{ user.phone}}"> </p>
<p><input type="submit" value="更新用户"> </p>
</form>
</body>
</html>
终端运行
python app.py runserver
运行结果
边栏推荐
- redis中常见的问题(缓存穿透,缓存雪崩,缓存击穿,redis淘汰策略)
- nodejs+express实现数据库mysql的访问,并展示数据到页面上
- WMS仓储管理系统能解决电子行业哪些仓库管理问题
- .NET Static Code Weaving - Rougamo Release 1.1.0
- 在Activity中获取另一个XML文件的控件
- this巩固训练,从两道执行题加深理解闭包与箭头函数中的this
- TensoFlow学习记录(二):基础操作
- Observability:你所需要知道的关于 Syslog 的一些知识
- Installation and configuration of nodejs+npm
- 如何通过单步调试的方式找到引起 Fiori Launchpad 路由错误的原因试读版
猜你喜欢
随机推荐
vxe-table 从页面批量删除数据 (不动数据库里的数据)
JS 从零教你手写节流throttle
Google Earth Engine ——利用公开的河流数据计算河流的有效宽度
typescript48-函数之间的类型兼容性
通用的测试用例编写大全(登录测试/web测试等)
typescript53-泛型约束
在Activity中获取另一个XML文件的控件
Mvc, Mvp and Mvvm
Modulo operation (MOD)
敏捷交付的工程效能治理
GNSS文章汇总
nodejs installation and environment configuration
typescript51 - basic use of generics
Apache DolphinScheduler新一代分布式工作流任务调度平台实战-中
VR全景拍摄线上展馆,3D全景带你沉浸体验
typescript56 - generic interface
可变字符串
Web3 安全风险令人生畏?应该如何应对?
How to find the cause of Fiori Launchpad routing errors by single-step debugging
【store商城项目01】环境准备以及测试