【Falsk 使用数据库】---- 数据库基本操作



一、查询操作

  • 通过对模型类的query属性调用可选的过滤方法,我们就可以获取到单个或多个记录(记录以模型类的实例表示)。查询语句如下:
<模型类>.query.<过滤方法(可选)>.<查询方法>

下面是一些常用的过滤方法:

  • filter():使用指定的规则过滤记录,返回新产生的查询对象
  • filter_by():使用指定规则过滤记录(以关键字表达式的形式),返回新产生的查询对象
  • order_by():根据指定条件对记录进行排序,返回新产生的查询对象
  • group_by():根据指定条件对记录进行分组,返回新的查询对象

下面是一些常用的查询方法:

  • all():返回包含所有查询记录的列表
  • first():返回查询的第一条记录,如果未找到,则返回None
  • get(id):传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回None
  • count():返回查询结果的数量
  • first_or_404():返回查询的第一条记录,如果未找到,则返回404错误响应
  • get_or_404(id):传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回404错误响应
  • paginate():返回一个Pagination对象,可以对记录进行分页处理
if __name__ == '__main__':

    # 查询
    # select * from users where users.name='Tom';
    user = User.query.filter(User.name == 'Tom')
    print(user)
    user = User.query.filter(User.name == 'Tom').all()
    print(user)

    # 提交会话
    db.session.commit()
    # 运行
    app.run(debug=True)

在这里插入图片描述

返回顶部


二、增、删、改操作

基本概念

  • 在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理
    • 会话用db.session表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用commi()方法提交会话
  • 在Flask-SOLAlchemy中,查询操作是通过query对象操作数据
    • 最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询
db.session.add(role)  添加到数据库的session中
db.session.add_all([user1,user2]) 添加多个信息到session中
db.sessica.commit()     提交数据库的修改(包括增、删、改)
db.session.rollback()     数据库的回滚操作
db.session.delete(user) 删除数据库(需要跟上commit)

1.数据增加

  • db.session.add(role) 添加单个信息到数据库的session中
  • db.session.add_all([user1,user2]) 添加多个信息以list的形式到session中
if __name__ == '__main__':
    # 删除原有
    db.drop_all()
    # 创建新的表
    db.create_all()

    # 插入数据
    # roles表
    role1 = Role(id=1, role="admin")
    role2 = Role(id=2, role="common_user")
    # 添加到session中
    db.session.add_all([role1, role2])
    # 提交会话
    db.session.commit()
    # users表
    user1 = User(id=1, name="Jack", role_id=2)
    user2 = User(id=2, name="Tom", role_id=1)
    user3 = User(id=3, name="Alice", role_id=2)
    # 添加到session中
    db.session.add_all([user1,user2,user3])
    # 提交会话
    db.session.commit()
    # 运行
    app.run(debug=True)

结果展示
在这里插入图片描述
返回顶部


2.数据删除

  • 获取到要删除的记录
    user = User.query.get(3)
    注意:查询记录get的参数是主键的值,这里要查询users表中主键值为1的记录
  • 定义删除
    db.session.delete(user)
  • 提交会话
    db.session.commit()
# -*- coding: utf-8
#  @Time    : 2020/12/19 11:30
#  @Author  : ZYX
#  @File    : data_delete.py
# @software: PyCharm
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 创建Flask对象
app = Flask(__name__)
# 配置数据库信息
# 数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@127.0.0.1:3306/Flask"
# 跟踪数据库的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 创建数据库对象
db = SQLAlchemy(app)

'''
创建两张表:用户表、用户身份表
其中通过id将用户与身份关联起来
'''
# 创建数据库模型,需要继承自 db.Model
class Role(db.Model):
    # 定义表名
    __tablename__ = "roles"
    # 定义字段及其属性
    # db.Model 表示是一个字段
    id = db.Column(db.Integer, primary_key=True)  # id字段,int类型,主键
    role = db.Column(db.String(16), unique=True)  # name字段,string类型,唯一

class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    # db.ForeignKey("roles.id") 表示是一个外键,声明时需要指定:表名.字段名
    role_id = db.Column(db.Integer, db.ForeignKey("roles.id"))  # 声明该字段为roles的外键

@app.route('/index')
def index():
    pass

if __name__ == '__main__':
    # 查找出要删除的数据
    user = User.query.get(3)
    print(user)
    # 定义删除
    db.session.delete(user)
    # 提交会话
    db.session.commit()
    # 运行
    app.run(debug=True)

在这里插入图片描述
注意:在删除的时候使用该方法后会报错,但是查询结果显示已经执行了删除操作,网上查找也没找到正确的解释,稍后会更新~
在这里插入图片描述
返回顶部


3.数据修改

  • 获取到要修改的记录
    user = User.query.get(1)
    注意:查询记录get的参数是主键的值,这里要查询users表中主键值为1的记录
  • 定义修改的内容
    user.name = "li"
  • 提交会话
    db.session.commit()
# -*- coding: utf-8
#  @Time    : 2020/12/19 10:38
#  @Author  : ZYX
#  @File    : data_update.py
# @software: PyCharm
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 创建Flask对象
app = Flask(__name__)
# 配置数据库信息
# 数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@127.0.0.1:3306/Flask"
# 跟踪数据库的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 创建数据库对象
db = SQLAlchemy(app)

'''
声明两张表及其结构:用户表、用户身份表
其中通过id将用户与身份关联起来
'''
# 创建数据库模型,需要继承自 db.Model
class Role(db.Model):
    # 定义表名
    __tablename__ = "roles"
    # 定义字段及其属性
    # db.Model 表示是一个字段
    id = db.Column(db.Integer, primary_key=True)  # id字段,int类型,主键
    role = db.Column(db.String(16), unique=True)  # name字段,string类型,唯一


class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    # db.ForeignKey("roles.id") 表示是一个外键,声明时需要指定:表名.字段名
    role_id = db.Column(db.Integer, db.ForeignKey("roles.id"))  # 声明该字段为roles的外键

@app.route('/index')
def index():
    pass

if __name__ == '__main__':
    # 取到要修改的记录
    user = User.query.get(1)
    # 定义修改的内容
    user.name = "li"
    # 提交会话
    db.session.commit()
    # 运行
    app.run(debug=True)

在这里插入图片描述
返回顶部


注意:在编写程序的时候需要声明表的结构
在这里插入图片描述
返回顶部


三、关系引用

在这里插入图片描述
仅仅为了方便查询,我们需要一些属性便利地去查询数据,但是又不想让这些属性出现在数据库的字段中。比如:我们想直接通过user查询出用户所属的角色名,一般都是先查找出用户对应的角色编号,通过编号到Role表中去查询对应的角色。

# -*- coding: utf-8
#  @Time    : 2020/12/20 8:36
#  @Author  : ZYX
#  @File    : data_relationship.py
# @software: PyCharm
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 创建Flask对象
app = Flask(__name__)
# 配置数据库信息
# 数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@127.0.0.1:3306/Flask"
# 跟踪数据库的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 创建数据库对象
db = SQLAlchemy(app)

'''
创建两张表:用户表、用户身份表
其中通过id将用户与身份关联起来
'''
# 创建数据库模型,需要继承自 db.Model
class Role(db.Model):
    # 定义表名
    __tablename__ = "roles_rs"
    # 定义字段及其属性
    # db.Model 表示是一个字段
    id = db.Column(db.Integer, primary_key=True)  # id字段,int类型,主键
    role = db.Column(db.String(16), unique=True)  # name字段,string类型,唯一

    # 添加关联
    # users = db.relationship('User', backref='role') 表示和User模型发生了关联,增加了一个users属性
    # backref = 'role' 反向引用,表示role是User要用的属性
    users = db.relationship('User',backref ='role')

    # repr()方法显示一个可读的字符串
    def __repr__(self):
        return '<Role:%s %s>' % (self.role,self.id)


class User(db.Model):
    __tablename__ = "users_rs"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    email = db.Column(db.String(32),unique=True)
    password = db.Column(db.String(32))
    # db.ForeignKey("roles.id") 表示是一个外键,声明时需要指定:表名.字段名
    role_id = db.Column(db.Integer, db.ForeignKey("roles_rs.id"))  # 声明该字段为roles的外键
    # User希望有role属性,但是这个属性的定义,需要在另一个模型中定义

    # repr()方法显示一个可读的字符串,相当于重写toString
    def __repr__(self):
        return '<User:%s %s %s %s >' % (self.id,self.name,self.email,self.password)

@app.route('/index')
def index():
    pass

if __name__ == '__main__':
    db.drop_all()
    db.create_all()
    # 添加元素
    role1 = Role(id=1,role="admin")
    role2 = Role(id=2, role="user")
    db.session.add_all([role1,role2])
    # 提交会话
    db.session.commit()
    # 添加元素
    user1 = User(id=1,name="Tom",email="1442314632@.qq.com",password="123",role_id=2)
    user2 = User(id=2,name="Jack",email="3519232933@.qq.com",password="123",role_id=1)
    db.session.add_all([user1,user2])
    # 提交会话
    db.session.commit()
    # 运行
    app.run(debug=True)

  • users = db.relationship('User', backref='role') 表示和User模型发生了关联,增加了一个users属性
  • backref = 'role' 反向引用,表示role是User方便查询时要用的属性
# 添加关联
 users = db.relationship('User',backref ='role')

通过表的生成也可以看出,relationship声明的字段并不会被真正的添加到表中!!!
在这里插入图片描述

  • 查询
if __name__ == '__main__':

    # 查询
    # 查询id为1的用户信息
    user = User.query.filter(User.id == 1).first()
    # 查询所有Role模型内的数据列表
    role = Role.query.all()
    # 输出user查询结果
    print(user)
    # 输出关联后的快速查询结果,id为1的用户角色是普通用户,id为2
    print(user.role)
    # 遍历Role模型数据,输出对应的用户信息
    for each in role:
       print(each.users)
    # 提交会话
    db.session.commit()
    # 运行
    app.run(debug=True)

在这里插入图片描述
返回顶部


四、实现简单的查询

  • 创表插入数据
# -*- coding: utf-8
#  @Time    : 2020/12/20 9:57
#  @Author  : ZYX
#  @File    : data_query.py
# @software: PyCharm
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

# 创建Flask对象
app = Flask(__name__)
# 配置数据库信息
# 数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@127.0.0.1:3306/Flask"
# 跟踪数据库的修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 创建数据库对象
db = SQLAlchemy(app)

'''
创建两张表:用户表、用户身份表
其中通过id将用户与身份关联起来
'''


# 创建数据库模型,需要继承自 db.Model
class Role(db.Model):
    # 定义表名
    __tablename__ = "roles_query"
    # 定义字段及其属性
    # db.Model 表示是一个字段
    id = db.Column(db.Integer, primary_key=True)  # id字段,int类型,主键
    role = db.Column(db.String(16), unique=True)  # name字段,string类型,唯一

    # 添加关联
    # users = db.relationship('User', backref='role') 表示和User模型发生了关联,增加了一个users属性
    # backref = 'role' 反向引用,表示role是User要用的属性
    users = db.relationship('User', backref='role')

    # repr()方法显示一个可读的字符串
    def __repr__(self):
        return '<Role:%s %s>' % (self.role, self.id)

class User(db.Model):
    __tablename__ = "users_query"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(16), unique=True)
    email = db.Column(db.String(32), unique=True)
    password = db.Column(db.String(32))
    # db.ForeignKey("roles.id") 表示是一个外键,声明时需要指定:表名.字段名
    role_id = db.Column(db.Integer, db.ForeignKey("roles_query.id"))  # 声明该字段为roles的外键
    # User希望有role属性,但是这个属性的定义,需要在另一个模型中定义

    # repr()方法显示一个可读的字符串
    def __repr__(self):
        return '<User:%s %s %s %s >' % (self.id, self.name, self.email, self.password)

@app.route('/index')
def index():
    pass

if __name__ == '__main__':
    # 创表
    db.drop_all()
    db.create_all()
    # 插入一条数据
    ro1 = Role(id=1,role='admin')
    db.session.add(ro1)
    db.session.commit()
    # 再次插入一条数据
    ro2 = Role(id=2,role='user')
    db.session.add(ro2)
    db.session.commit()
    us1 = User(id=1, name='Wang', email="wang@163.com", password="123456", role_id=ro1.id)
    us2 = User(id=2, name='Zhang', email='zhang@189.com', password="201512", role_id=ro2.id)
    us3 = User(id=3, name='Chen', email='chen@126.com', password="987654", role_id=ro2.id)
    us4 = User(id=4, name='Zhou', email="zhou@163.com", password="456789", role_id=ro1.id)
    us5 = User(id=5, name='Tang', email="tang@163.com", password='158104', role_id=ro2.id)
    us6 = User(id=6, name='Wu', email='wu@163.com', password='5623514', role_id=ro2.id)
    us7 = User(id=7, name='Qian', email="qian@gmail.com", password='1543567', role_id=ro1.id)
    us8 = User(id=8, name='Liu', email='Liu@itheina.com', password="867322", role_id=ro1.id)
    us9 = User(id=9, name='Li', email="Li@163.com", password="4526342", role_id=ro2.id)
    us10 = User(id=10, name='Sun', email='sun@163.com', password='235523', role_id=ro2.id)
    db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10])
    db.session.commit()
    # 运行
    app.run(debug=True)

在这里插入图片描述

1.查询所有用户信息

if __name__ == '__main__':

    # 1.查询所有用户数据
    all_user_info = User.query.all()
    for user in all_user_info:
        print(user)
    # 提交事务
    db.session.commit()
    app.run(debug=True)

在这里插入图片描述

返回顶部


2.查询有多少个用户

if __name__ == '__main__':

    # 2.查询有多少个用户
    users_count = User.query.count()
    print(users_count)

    db.session.commit()
    app.run(debug=True)

在这里插入图片描述

返回顶部


3.查询第一个用户

if __name__ == '__main__':

    # 3.查询第一个用户
    first_user = User.query.first()
    print(first_user)
    
    db.session.commit()
    app.run(debug=True)

在这里插入图片描述

返回顶部


4.查询id为3的用户 ---- 3种方式

if __name__ == '__main__':

    # 4.查询id为4的用户
     user_s1 = User.query.filter(User.id == 4).first()
    user_s2 = User.query.get(4)
    user_s3 = User.query.filter_by(id=4).first()
    print(user_s1)
    print(user_s2)
    print(user_s3)
    # 提交事务
    db.session.commit()
    app.run(debug=True)

在这里插入图片描述

返回顶部


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着蜗牛ひ追导弹'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值