四川手机网站建设费用技能培训学校

bicheng/2026/1/24 19:56:15/文章来源:
四川手机网站建设费用,技能培训学校,政务公开系统网站建设,网站源码对应的数据库怎么做ORM flask 通过Model操作数据库#xff0c;不管你的数据库是MySQL还是Sqlite#xff0c;flask自动帮你生成相应数据库类型的sql语句#xff0c;所以不需要关注sql语句和类型#xff0c;对数据的操作flask帮我们自动完成#xff0c;只需要会写Model就可以了 flask使用对象关…ORM flask 通过Model操作数据库不管你的数据库是MySQL还是Sqliteflask自动帮你生成相应数据库类型的sql语句所以不需要关注sql语句和类型对数据的操作flask帮我们自动完成只需要会写Model就可以了 flask使用对象关系映射简称为ORM框架去操控数据库 ORM对象关系映射是一种程序技术用于实现面向对象变成语言里不同类型系统的数据之间的转换将对对象的操作转换为原生的SQL语句。简单易用可以有效减少重复的SQL性能损耗少设计灵活可以轻松实现复杂查询可移植性好 数据库连接 Flask使用Python自带的ORMSQLAlchemy。针对于Flask的支持需要安装相应的插件 pip install flask-sqlalchemy为什么使用sqlite而不是mysql SQLite和MySQL是两种常见的数据库管理系统它们之间有一些重要的区别。 数据库类型SQLite是一种嵌入式数据库它将整个数据库作为一个文件存储在磁盘上。而MySQL是一种客户端/服务器数据库它以独立的服务器进程运行并通过网络接口来处理客户端请求。 部署和配置由于SQLite是一个嵌入式数据库它非常容易部署和配置。你只需要在应用程序中包含SQLite的库文件即可。MySQL需要单独安装和配置数据库服务器并通过网络连接来访问。 性能和扩展性SQLite适用于小型应用程序和个人项目因为它在处理大量数据和高并发访问时可能性能较低。相比之下MySQL被设计用于处理大型数据集和高负载的应用程序它具有更好的性能和扩展性。 功能和支持MySQL是一个成熟的数据库管理系统提供了广泛的功能和丰富的工具。它支持复杂的查询语言如SQL事务处理和高级安全特性。相比之下SQLite是一个轻量级的数据库功能相对较少。 并发处理MySQL支持多个并发连接可以同时处理多个客户端请求。SQLite在写操作时会锁定整个数据库文件因此在高并发访问情况下可能会出现性能问题。 综上所述SQLite适用于小型应用程序和个人项目而MySQL适用于中大型应用程序和高负载环境。选择哪种数据库取决于你的具体需求和项目规模。 连接配置 直接看老师讲的视频好了容易理解。千峰教育 Flask2入门 数据库连接 数据迁移 当数据库和表配置好后需要进行数据迁移这样会在项目中生成真正的数据库和表。 基本步骤如下 使用cmd打开项目目录app.py所在的目录依次输入下面的命令 flask db init 创建迁移文件夹migrates只调用一次flask db migrate 生成迁移文件flask db upgrade 执行迁移文件中的升级flask db downgrade 执行迁移文件中的降级 初始化 执行完会在项目根目录下生成对应的文件夹instance和migrations 生成迁移文件 会生成数据库db文件 并且会生成一个操作记录的py文件 生成表 实际上就是执行的上一次生成文件里的upgrade函数执行完成后我们可以使用类似dberver的工具来进行查看 修改表结构 在修改表结构时比如新添加一列。必须要先修改对应的模型然后在重新进行生成迁移文件、执行迁移文件中的升级。 数据库的常见操作 新增数据 baseBlue.route(/add-user/) def addUser():# 创建一个对象user BaseModel()user.name 张三user.email 2345163.comuser.password 123user.create_time datetime.now()# 将对象添加进session中db.session.add(user)# 将数据提交到数据库db.session.commit()data {code: 0, data: , msg: 添加成功}return jsonify(data)如果添加多条数据时可以使用add_all例如 users []for i in range(10):user BaseModel()user.name 张三 str(i)user.email 2345163.comuser.password 123user.create_time datetime.now()users.append(user)db.session.add_all(users)db.session.commit()同时可以添加异常处理 def addUser():# 创建一个对象user BaseModel()user.name 张三user.email 2345163.comuser.password 123user.create_time datetime.now()try:# 将对象添加进session中db.session.add(user)# 将数据提交到数据库db.session.commit()data {code: 0, data: , msg: 添加成功}except Exception as e:data {code: 1, data: , msg: 添加失败}db.session.rollback() # 回滚db.session.flush() # 清空sessionprint(addUser errorstr(e))return jsonify(data)删除数据 def delUser(id):try:user BaseModel.query.get(id)db.session.delete(user)db.session.commit()data {code: 0, data: , msg: 删除成功}except Exception as e:data {code: 1, data: , msg: 删除失败}db.session.rollback() # 回滚db.session.flush() # 清空sessionprint(delUser errorstr(e))return jsonify(data)修改数据 def updateUser(id):try:user BaseModel.query.get(id)user.name李四db.session.commit()data {code: 0, data: , msg: 修改成功}except Exception as e:data {code: 1, data: , msg: 修改失败}db.session.rollback() # 回滚db.session.flush() # 清空sessionprint(updateUser errorstr(e))return jsonify(data)查询数据 过滤器 filter() 把过滤器添加到原查询上返回一个新的查询limit() 使用指定的值限制原查询返回的结果数量返回一个新的查询offset() 偏移原查询返回的结果返回一个新的查询order_by() 根据指定条件对原查询结果进行排序返回一个新查询group_by() 根据指定条件对原查询结果进行分组返回一个新的查询 常用查询 all() 以列表形式返回查询的所有结果返回列表first() 返回查询的第一个结果如果没有结果返回Noneget() 返回指定主键对应的行如果没有对应的行则返回Nonecount() 返回查询结果的数量paginate() 返回一个Paginate对象它包含指定范围内的结果 逻辑运算 and_ 逻辑与filter()默认为逻辑与多个条件时用逗号分隔or_ 逻辑或not_ 逻辑非 查询属性 contains() contains(3) 模糊查找类似于sql中的likein_() in_([1,2,3]) 其中之一startswith() 和 endswidth() 以什么开始和以什么结束 根据用户名模糊查询 def queryUser(name):try:users BaseModel.query.filter(BaseModel.name.like(%name%)).all()res [user.to_dict() for user in users]data {code: 0, data: res, msg: 查询成功}except Exception as e:data {code: 1, data: , msg: 查询失败}print(queryUser errorstr(e))return jsonify(data)注意查询返回的结果是模型对象因此需要将模型对象转换为字典 class BaseModel(db.Model):# 表的名字__tablename__ base_user# 表的结构id db.Column(db.Integer, primary_keyTrue, autoincrementTrue) # 主键name db.Column(db.String(20), uniqueFalse, nullableFalse) # 用户名email db.Column(db.String(20), uniqueTrue, nullableFalse) # 邮箱password db.Column(db.String(20), nullableFalse) # 密码rank db.Column(db.String(20), nullableFalse,defaultuser) # 用户等级admin为管理员user为普通用户create_time db.Column(db.DateTime, nullableFalse) # 创建时间# 将模型对象转换为字典def to_dict(self):return {c.name: getattr(self, c.name) for c in self.__table__.columns}query.filter就相当于sql中的where查询如果存在多个查询条件时可以如下操作 from sqlalchemy import and_, or_# 示例查询条件 condition1 BaseModel.column1 value1 condition2 BaseModel.column2 value2 condition3 BaseModel.column3.like(% value3 %)# 使用 and_ 方法将多个条件组合为与关系 query BaseModel.query.filter(and_(condition1, condition2, condition3))# 或者使用 or_ 方法将多个条件组合为或关系 query BaseModel.query.filter(or_(condition1, condition2, condition3))# 执行查询 results query.all()或者 from sqlalchemy import or_conditions [User.username user1,User.id 5,# ... ]query User.query query query.filter(or_(*conditions))users query.all()分页查询 SQLAlchemy内部提供了paginate方法来实现分页的功能。 # 分页查询 baseBlue.route(/get-all-user, methods[POST]) def getAllUser():# 获取前端传递过来的参数page int(request.form.get(page))page_size int(request.form.get(pageSize))p BaseModel.query.paginate(pagepage, per_pagepage_size, error_outFalse)# 将模型对象转换为字典data [item.to_dict() for item in p.items]res {code: 0,data: {total: p.total,page: p.page,pageSize: p.per_page,list: data},msg: 查询成功}return jsonify(res)paginate对象的属性 items返回当前页的内容列表has_next是否还有下一页has_prev是否还有上一页next(error_outFalse)返回下一页的Pagination对象prev(error_outFalse)返回上一页的Pagination对象page当前的页码从1开始pages总页数pre_page每页显示的数量prev_num上一页页码数next_num下一页页码数total查询返回的记录总数 多表操作 一对多 学生、班级表 class Grade(db.Model):# 表名__tablename__ grade# 表结构id db.Column(db.Integer, primary_keyTrue, autoincrementTrue, doc主键)name db.Column(db.String(10), uniqueTrue, nullableFalse, doc班级名称)# 建立联系# 参数1表名类的名称这里要用字符串# 参数2反向引用的名称grade对象让student去反过来得到grade对象的名称# 这样Student表可以直接使用Grade中的字段而不是使用班级id再去表里查询# 参数3懒加载# 这里的students不是表字段是一个类属性students db.relationship(Student, backrefgrade, lazydynamic)# 学生表 class Student(db.Model):__tablename__ student# 字段id db.Column(db.Integer, primary_keyTrue, autoincrementTrue, doc主键)name db.Column(db.String(10), uniqueTrue, nullableFalse, doc学生姓名)grade_id db.Column(db.Integer, db.ForeignKey(grade.id), nullableFalse, doc班级id)lazy属性 lazy属性懒加载可以延迟在使用关联属性的时候才建立关联 lazydynamic会返回一个query对象查询集可以继续使用其他的查询方法比如all()lazyselect首次访问到属性的时候就会全部加载该属性的数据lazyjoined在对关联的两个表进行join操作是从而获取到所有相关的对象lazyTrue返回一个可用的列表对象同select 增加数据 def addGradeStudent():student Student()student.name 张三student.grade_id 1try:db.session.add(student)db.session.commit()data {code: 0, data: , msg: 添加成功}except Exception as e:data {code: 1, data: , msg: 添加失败}db.session.rollback() # 回滚db.session.flush() # 清空session修改、删除操作基本上也与单表操作一致。需要注意的是比如在删除班级时这个班级里有学生。删除后学习表里的学生不会被删除但是学习对应的班级id会变为null 查询 # 查询学生所在班级的班级名称 def getGradeName():try:student Student.query.get(1)# 这里使用了反向引用这样就不许要再查询班级表gradeName student.grade.nameres {code: 0, data: gradeName, msg: 查询成功}data {code: 0, data: res, msg: 查询成功}except Exception as e:data {code: 1, data: , msg: 查询失败}print(getGradeName errorstr(e))# 查询班级下的所有学生grade Grade.query.get(1)students grade.students多对多 多对多需要创建一个中间表比如用户收藏电影需要有用户表、收藏表、电影表收藏表就是这个中间表。 用户表、电影表、收藏表 # 用户表 class User(db.Model):__tablename__ userid db.Column(db.Integer, primary_keyTrue, autoincrementTrue, doc主键)username db.Column(db.String(10), uniqueTrue, nullableFalse, doc用户名)# 类属性不是表字段。collections db.relationship(Collection, back_populatesuser)# 电影表 class movie(db.Model):__tablename__ movieid db.Column(db.Integer, primary_keyTrue, autoincrementTrue, doc主键)name db.Column(db.String(10), uniqueTrue, nullableFalse, doc电影名称)score db.Column(db.Float, nullableFalse, doc评分)collections db.relationship(Collection, back_populatesmovie)# 收藏表 class Collection(db.Model):id db.Column(db.Integer, primary_keyTrue,doc主键)user_id db.Column(db.Integer, db.ForeignKey(user.id),doc用户id)movie_id db.Column(db.Integer, db.ForeignKey(movie.id),doc电影id)user db.relationship(User, back_populatescollections)movie db.relationship(Movie, back_populatescollections)back_populates 是 SQLAlchemy 关系的一个参数用于指定两个模型之间的双向关联关系。当在一个模型类中定义了一个关系并指定了另一个模型类时back_populates 参数允许你在另一个模型类中定义一个相反方向的关系。 与 backref 不同back_populates 必须在双方都明确声明而 backref 只需要在一方声明即可自动创建另一方的反向引用。back_populates 更适合于复杂的关系映射和控制反向引用的名称。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搜狗网站收录如何做logo标志

YOLOv8 是 YOLO (You Only Look Once) 系列目标检测算法的最新版本,以其高速度和高精度而著称。在电力行业中,绝缘子是电力传输线路上的重要组件之一,它们用于支撑导线并保持电气绝缘。由于长期暴露在户外环境中,绝缘子容易出现损…

网站开发技术方案编写vue适合什么样的网站开发

当问到多线程时候如何解决线程安全的问题时候,大部分人都知道加锁。提到锁最先接触到的就是Synchronized关键字。 当我们想要保证一个共享资源在同一时间只会被一个线程访问到时,我们可以在代码中使用synchronized关键字对类或者对象加锁 synchronized…

做电商网站前期做什么工作网站设计 手写

文章目录 技术交流群1、360 NLP 算法岗2、腾讯 NLP 算法岗3、百度 NLP 算法岗用通俗易懂方式讲解系列 节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂同学、参加社招和校招面试的同学,针对大模型技术趋势、大模型落地项…

大连公司注册网站淮南网站优化

目录 3 地面滤波及单木分割 3.1 地面滤波(Ground Filtering) 3.2 单木分割(Single-Tree Segmentation)

公司建设网站时的注意事项wordpress自定义用户字段

leetcode原题链接&#xff1a;跳跃游戏 II 题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j &…

app网站建设宣传方案提高工作效率英语

您的 Android 设备密码有助于保护您的数据并防止您的个人信息被滥用。但是&#xff0c;如果您被锁定在Android设备之外怎么办&#xff1f;我们知道忘记您的 Android 手机密码是多么令人沮丧&#xff0c;因为它会导致您的设备和数据无法访问。在本技术指南中&#xff0c;我们将向…

汕头网站建设seo外包凡客诚品售后服务

上一篇文章讲了下用工具转换相关的格式&#xff1a;https://blog.csdn.net/weixin_42019349/article/details/134654695 今天来分享一个python库实现上述功能&#xff0c;实现文件转换自由 ^_^ 主角就是pypandoc库 # 安装方式 pip install pypandoc# pypandoc主要有三个函数…

网站前端开发得会什么软件电商平台的设计

作用域 & 上下文 作用域链 - 儿子能用爸爸的东西&#xff0c;调皮的儿子&#xff08;var&#xff09;可以去领居家&#xff08;块级&#xff09;拿东西 面试题&#xff1a; let a globalconsole.log(a)function course() {let b zhaowaconsole.log(b)// 2.6 函数提升 &…

淄博企业建网站在线查询企业

数组删除元素 1.利用新的数组 将原数组arr的元素&#xff0c;复制到新数组newArr中&#xff0c;复制过程中将要删除的元素&#xff0c;选择不复制 public class Test01{public static void main(String [] args){String [] arr {"zhangsan","lisi","…

网站建设主要工作流程在线logo制作生成免费

Pygame是一个流行的Python库&#xff0c;用于开发2D游戏。尽管它主要用于桌面游戏&#xff0c;但通过一些额外的工具和技巧&#xff0c;你也可以使用Pygame来打造多平台游戏&#xff0c;比如支持Windows、Linux、macOS、Android和iOS等平台。 下面是一个简单的Pygame游戏示例&…

怎么在网上卖东西给外国人网站优化需要什么

文章《ArcGIS栅格影像(NDVI)归一化处理的两种方法精解》详细介绍了ArcGIS中进行NDVI影像归一化处理的两种方法,但是无法批量进行,本文就放大招用Python实现批量NDVI归一化处理,大大提高了工作效率,还不赶快Get了? 完整Python代码: import arcpy from arcpy import env…

百度指数网站wordpress菜单显示图片

当涉及到编写自动化测试时&#xff0c;测试框架和工具的选择对于测试用例的设计和执行非常重要。在Python 中&#xff0c;pytest是一种广泛使用的测试框架&#xff0c;它提供了丰富的功能和灵活的扩展性。其中一个很有用的功 能是fixture方法&#xff0c;它允许我们初始化测试环…

兰陵住房建设局网站模板做网站上传

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;2194. Excel 表中某个范围内的单元格 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 双层循环遍历所有可能性即可。 解题代码&#xff1a; class Solution {public List<String> c…

做渠道该从哪些网站入手程序员和软件开发的区别

2824. 统计和小于目标的下标对数目 2824. 统计和小于目标的下标对数目 代码仓库地址&#xff1a; https://github.com/slience-me/Leetcode 个人博客 &#xff1a;https://slienceme.xyz 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target &#xff0c;请你…

网站软文代写方维网络科技有限公司

把一些配置信息保存在json文件可以避免更改时要重新发布程序的烦恼。 我这里使用的是写一个类文件&#xff0c;然后通过program.cs启动的方式&#xff08;.net 6 开始没有startup了&#xff09;。 项目类型&#xff1a;ASP.NET Core Web MVC / .NET 7.0 / VS2022 第一步…

网站建设系统哪个好想开加工厂怎么找订单

漏洞描述 该漏洞的存在是由于 Google Chrome 中用户提供的 XML 输入验证不足。远程攻击者可以创建特制网页&#xff0c;诱骗受害者访问该网页并获取用户系统上的敏感信息。远程攻击者可利用该漏洞通过构建的 HTML 页面绕过文件访问限制&#xff0c;导致chrome任意文件读取。Li…

网站设计文字大小高端上海网站设计公司

思路&#xff1a; 循环2023的每一天&#xff0c;一共八位数&#xff1b;年份是确定的&#xff0c;只需要循环月份和天数&#xff0c;注意这里已知2023的2月份天数为28天。用b数组 int b[8]{2,0,2,3,month/10,month%10,d/10,d%10};//枚举2023的每一天来和已知数据的八位数字比较…

泰安做网站的公司建站边检站

目录 1、概念 2、格式 3、特性 4、引用作为函数的参数 5、引用作为函

建设个网站黄冈网站建设哪家快些

1 REST REST 不是一种协议&#xff0c;它是一种架构。大部分REST的实现中使用了RPC的机制&#xff0c;大致由三部分组成&#xff1a; method&#xff1a;动词&#xff08;GET、POST、PUT、DELETE之类的&#xff09;Host&#xff1a;URI&#xff08;统一资源标识&#xff09;&…

山东网站建设公司推荐wordpress 存储位置

Flink学习笔记 前言&#xff1a;今天是学习 flink 的第 12 天啦&#xff01;学习了 flink 高级特性和新特性之 End-to-End Exactly-Once&#xff08;端到端精确一致性语义&#xff09;&#xff0c;主要是解决大数据领域数据从数据源到数据落点的一致性&#xff0c;不会容易造成…