3.flask-sqlalchemy ORM库

这篇具有很好参考价值的文章主要介绍了3.flask-sqlalchemy ORM库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

Flask-SQLAlchemy是一个用于Flask的扩展,它提供了一个便捷的方式来处理数据库操作。Flask-SQLAlchemy基于SQLAlchemy,一个功能强大的Python SQL工具包和对象关系映射(ORM)系统
官网文档:http://www.pythondoc.com/flask-sqlalchemy/

一.安装

pip install flask-sqlalchemy

二.flask-sqlalchemy基本使用

from flask import Flask  
from flask_sqlalchemy import SQLAlchemy  
  
app = Flask(__name__)  
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost/bruce_demo'
db = SQLAlchemy(app)


  

class User(db.Model):  

    id = db.Column(db.Integer, primary_key=True)  

    username = db.Column(db.String(80), unique=True, nullable=False)  

    email = db.Column(db.String(120), unique=True, nullable=False)  

    password = db.Column(db.String(120), nullable=False)
if __name__ == '__main__':  
    db.create_all()
    users = db.session.query(User).filter_by(username='John').all()  
	for user in users:  
    	print(user.email)
    # 创建新用户对象  
	new_user = User(username='John', email='john@example.com', password='password')  
	db.session.add(new_user)  
	db.session.commit()  # 提交更改到数据库  
	  
	# 查询用户对象  
	john = User.query.filter_by(username='John').first()  
	print(john.email)

三.flask-sqlalchemy常用方法


    db.create_all():创建数据库表。
    db.session.query(Model):创建查询对象,用于执行数据库查询。
    db.session.add(instance):将实例添加到数据库会话中。
    db.session.commit():提交更改到数据库。
    db.session.delete(instance):删除实例并提交更改。
    db.session.merge(instance):将实例合并到数据库会话中并提交更改。
    db.session.flush():执行数据库的flush操作,将所有的操作写入数据库。
    db.session.expunge(instance):从会话中驱逐实例。
    db.session.refresh(instance):刷新实例的属性,从数据库中获取最新数据。
    db.session.get_by(key, value):根据给定的键和值获取实例。
    db.session.filter_by(key=value):根据给定的键和值过滤会话中的实例。
    db.session.first():返回查询结果中的第一个实例。
    db.session.first_or_404():返回查询结果中的第一个实例,如果未找到则返回404错误。
    db.session.all():返回查询结果中的所有实例。
    db.session.count():返回查询结果中的实例数量。
    db.session.delete_all():删除会话中的所有实例并提交更改。
    db.session.flush_all():执行数据库的flush操作,将所有的操作写入数据库,并清空会话。
    db.relationship(RelatedModel):创建关联关系,将两个模型关联起来。
    db.backref(name, uselist=True):为关联关系创建一个反向引用,可以通过反向引用访问关联的实例。
    db.column_property(column):创建一个列属性,用于获取或计算特定列的值。
    db.SynonymProperty(name, column=None):创建一个同义词属性,用于获取或设置特定列的值。
    db.ext:提供扩展功能,例如关联数据缓存、继承策略等。

四.Flask-SQLAlchemy中的db.Column支持以下类型


    Integer:普通整数,一般是32位。
    SmallInteger:取值范围小的整数,一般是16位。
    BigInteger:不限制精度的整数,可以是int或long类型。
    Float:浮点数。
    String:变长字符串。
    Text:大文本字段。
    Boolean:布尔类型。
    DateTime:日期和时间类型。
    Date:日期类型。
    Time:时间类型。
    JSON:JSON格式数据类型。
    ARRAY:数组类型。
    PickleType:Pickle类型,用于存储Python对象结构。
    LargeBinary:大二进制字段。
    Enum:枚举类型。
    ARRAY:数组类型。
    JSON:JSON格式数据类型。
    TypeDecorator:用于自定义数据类型。
此外,db.Column还支持SQLAlchemy核心的任何数据类型,你可以根据需要自定义数据类型

五.关系模型

5.1一对多关系(OneToMany)

一对多关系是指一个模型与另一个模型之间存在多对一的关系。在 Flask-SQLAlchemy 中,你可以使用 relationship() 方法来定义一对多关系。下面是一个示例

from flask_sqlalchemy import SQLAlchemy  
  
db = SQLAlchemy()  
  
class User(db.Model):  
    id = db.Column(db.Integer, primary_key=True)  
    name = db.Column(db.String(50))  
    email = db.Column(db.String(50))  
    posts = db.relationship('Post', backref='user', lazy='dynamic')  
  
class Post(db.Model):  
    id = db.Column(db.Integer, primary_key=True)  
    title = db.Column(db.String(100))  
    content = db.Column(db.Text)

在上面的示例中,User 和 Post 之间存在一对多关系。每个用户可以有多个帖子,每个帖子都与一个用户关联。

5.2多对多关系(ManyToMany)

多对多关系是指多个模型之间存在多对多的关系。在 Flask-SQLAlchemy 中,你可以使用 secondary 参数来定义多对多关系。下面是一个示例

from flask_sqlalchemy import SQLAlchemy  
  
db = SQLAlchemy()  
  
class User(db.Model):  
    id = db.Column(db.Integer, primary_key=True)  
    name = db.Column(db.String(50))  
    email = db.Column(db.String(50))  
  
class Group(db.Model):  
    id = db.Column(db.Integer, primary_key=True)  
    name = db.Column(db.String(50))  
  
user_group = db.Table('user_group',  
    db.Column('user_id', db.Integer, db.ForeignKey('user.id')),  
    db.Column('group_id', db.Integer, db.ForeignKey('group.id'))  
)  
  
User.groups = db.relationship('Group', secondary=user_group, backref='users', lazy='dynamic')

在上面的示例中,User 和 Group 之间存在多对多关系。每个用户可以属于多个组,每个组可以包含多个用户。通过 secondary 参数,我们定义了一个名为 user_group 的中间表来存储用户和组之间的关联关系

5.3多对一关系(ManyToOne)

多对一关系是指多个模型与另一个模型之间存在一对多的关系。在 Flask-SQLAlchemy 中,你可以使用 relationship() 方法来定义多对一关系。下面是一个示例

from flask_sqlalchemy import SQLAlchemy  
  
db = SQLAlchemy()  
  
class User(db.Model):  
    id = db.Column(db.Integer, primary_key=True)  
    name = db.Column(db.String(50))  
    email = db.Column(db.String(50))  
    role_id = db.Column(db.Integer, db.ForeignKey('role.id'))  
  
class Role(db.Model):  
    id = db.Column(db.Integer, primary_key=True)  
    name = db.Column(db.String(50))  
    users = db.relationship('User', backref='role', lazy='dynamic')

在上面的示例中,User 和 Role 之间存在多对一关系。多个用户可以拥有一个角色,每个角色可以与多个用户关联。通过外键约束 role_id,我们将用户与角色关联起来

六.常用约束

选项名

常用的查询和过滤方法

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

问题一:外键约束不能直接删除

sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1451, ‘Cannot delete or update a parent row: a foreign key constraint fails (pearadminflask.pt_renewal, CONSTRAINT pt_renewal_ibfk_1 FOREIGN KEY (course_id) REFERENCES pt_course (id))’)
[SQL: DELETE FROM pt_course WHERE pt_course.id = %(id_1)s]
[parameters: {‘id_1’: ‘110’}]文章来源地址https://www.toymoban.com/news/detail-694827.html

#一对多
#班级:学生=1:N
#班级表
class Grade(db.Model):
    __tablename__='grade'#表名
    id = db.Column(db.Integer, primary_key=True,autoincrement=True)
    name = db.Column(db.String(30), unique=True)

    #建立关联
    #第1个参数:关联的模型名(表)
    #第2个参数:反向引用的名称,grade对象
    #让student去反过来得到grade对象的名称
    #第3个参数:懒加载
    #students
    students=db.relationship('Student',backref='grade',lazy=True)


#学生表
class Student(db.Model):
    __tablename__ = 'student'  # 表名
    id = db.Column(db.Integer, primary_key=True,autoincrement=True)

    name = db.Column(db.String(30), unique=True)

    age = db.Column(db.Integer)
    #外键
    gradeid=db.Column(db.Integer,db.ForeignKey(Grade.id))
item.id,item.name,item.age,item.gradeid,item.grade,item.grade.id,item.grade.name
#多对多
#用户:电影 =N:M


#中间表:收藏表
collect=db.Table(
    'collects',
    db.Column('user_id',db.Integer,db.ForeignKey('usermodel.id'),primary_key=True),
    db.Column('movie_id',db.Integer,db.ForeignKey('movie.id'),primary_key=True),
)
#用户表
class UserModel(db.Model):
    __tablename__='usermodel'#表名
    id = db.Column(db.Integer, primary_key=True,autoincrement=True)
    name = db.Column(db.String(30))
    age=db.Column(db.Integer)

#电影表
class Moive(db.Model):
    __tablename__='movie'#表名
    id = db.Column(db.Integer, primary_key=True,autoincrement=True)
    name = db.Column(db.String(30))
    #关联
    #secondary=collect :设置中间表
    """
    layz属性
    懒加载,可以延迟在使用关联属性的时候才建立关联
    lazy='dynamic'会返回一个query对象,查询集,可以继续使用其他查询方法,如all()
    lazy='select'首次访问到属性的时候,就会全部加载该属性的数据
    lazy='joined'在对关联的两个表进行join操作,从而获取到所有相关的对象
    lazy=True返回一个可用的列表对象,同select
    """
    users=db.relationship('UserModel',backref="movies",layz=True,secondary=collect)

用户收藏电影
user=UserModel.query.get(1)
moive=Moive.query.get(1)

user.movies.append(movie)
db.session.commit()

#查找某用户收藏的所有电影
user=UserModel.query.get(1)
print(user.moives)

#查找收藏了某电影的所有用户
moive=Movie.query.get(1)
print(moive.users)

#级联删除
user=UserModel.query.get(1)
db.session.delete(user)
db.session.commit()

到了这里,关于3.flask-sqlalchemy ORM库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python:使用Flask-SQLAlchemy对数据库增删改查的简单示例

    以下将介绍Flask-SQLAlchemy对数据库增删改查的简单示例。 一、安装所需的库 pip install flask flask-sqlalchemy flask-mysql 二、创建数据表 本示例使用mysql创建数据库和表 CREATE TABLE `user` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `name` varchar(255) DEFAULT NULL,   `age` int(11) DEFAULT NULL,   PRIMARY KEY (`id

    2024年02月07日
    浏览(51)
  • 3.flask-sqlalchemy ORM库

    Flask-SQLAlchemy是一个用于Flask的扩展,它提供了一个便捷的方式来处理数据库操作。Flask-SQLAlchemy基于SQLAlchemy,一个功能强大的Python SQL工具包和对象关系映射(ORM)系统 官网文档: http://www.pythondoc.com/flask-sqlalchemy/ 一对多关系是指一个模型与另一个模型之间存在多对一的关系。在

    2024年02月10日
    浏览(30)
  • flask---》更多查询方式/连表查询/原生sql(django-orm如何执行原生sql)/flask-sqlalchemy

    sqlalchemy执行原生sql django执行原生sql

    2024年02月13日
    浏览(27)
  • Flask-数据库-SQLAlchemy

    SQLAlchemy是flask的扩展,是一个功能强大的OR映射器,支持多种数据库后台,可以将类的对象映射至数据库表。 使用这个工具,可以创建数据库,创建表,并为数据库添加数据,进行查询操作等。 参考:Flask SQLAlchemy - Flask 教程 | BootWiki.com  app=Flask(__name__)  #创建Flask实例  app

    2023年04月09日
    浏览(32)
  • Flask数据库之SQLAlchemy--介绍--链接数据库

    目录 SQLAlchemy介绍 SQLAlchemy连接数据库  数据库是一个网站的基础!!! 比如MySQL、MongoDB、SQLite、PostgreSQL等,这里我们以MySQL为例进行讲解。 SQLAlchemy是一个ORM框架 对象关系映射 (英语: Object Relational Mapping ,简称 ORM ,或 O/RM ,或 O/R mapping ),是一种程序设计技术,用于实

    2024年02月07日
    浏览(48)
  • 大白话说Python+Flask入门(六)Flask SQLAlchemy操作mysql数据库

    这篇文章被搁置真的太久了,不知不觉拖到了周三了,当然,也算跟falsk系列说再见的时候,真没什么好神秘的,就是个数据库操作,就大家都知道的 CRUD 吧。 1、Flask SQLAlchemy简介 Flask SQLAlchemy 是基于 Flask web 框架和 SQLAlchemy ORM (对象关系映射)的工具。它旨在为 Flask web 应用

    2024年02月05日
    浏览(50)
  • Flask-SQLAlchemy

    认识Flask-SQLAlchemy Flask-SQLAlchemy 是一个为 Flask 应用增加 SQLAlchemy 支持的扩展。它致力于简化在 Flask 中 SQLAlchemy 的使用。 SQLAlchemy 是目前python中最强大的 ORM框架, 功能全面, 使用简单。 ORM优缺点 优点 有语法提示, 省去自己拼写SQL,保证SQL语法的正确性 orm提供方言功能(dialect, 可

    2024年02月12日
    浏览(27)
  • flask-sqlalchemy使用

    # sqlalchemy 集成到flask中 # 第三方: flask-sqlalchemy 封装了用起来,更简洁 安装 使用

    2024年02月13日
    浏览(75)
  • 【flask sqlalchmey】一次性将返回的列表对象或者 一行数据对象转成dict---flask-sqlalchemy输出json格式数据

    结果示例: 另外: res = Sysdict.query.all() 这种写法已经不被推荐了, 推荐的是scalar_one() 获取一行,scalars()获取多行 user = db.session.execute(db.select(User).filter_by(username=username)).scalar_one() users = db.session.execute(db.select(User).order_by(User.username)).scalars() 一般的 json.dumps(users) 或者 jsonify(use

    2024年02月13日
    浏览(38)
  • 【python】flask操作数据库工具SQLAlchemy,详细用法和应用实战

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,

    2024年04月17日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包