当前位置: 首页 > news >正文

郑州网站建设+论坛手机网站建设品牌好

郑州网站建设+论坛,手机网站建设品牌好,网站用哪个软件做,网站首页建设公司转载请在文章开头附上原文链接地址#xff1a;https://www.cnblogs.com/Sunzz/p/10979970.html 数据库操作 ORM ORM 全拼Object-Relation Mapping#xff0c;中文意为 对象-关系映射。主要实现模型对象到关系数据库数据的映射 优点 : 只需要面向对象编程, 不需要面向数据库编… 转载请在文章开头附上原文链接地址https://www.cnblogs.com/Sunzz/p/10979970.html 数据库操作 ORM ORM 全拼Object-Relation Mapping中文意为 对象-关系映射。主要实现模型对象到关系数据库数据的映射 优点 : 只需要面向对象编程, 不需要面向数据库编写代码. 对数据库的操作都转化成对类属性和方法的操作.不用编写各种数据库的sql语句.实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异. 不再需要关注当前项目使用的是哪种数据库。通过简单的配置就可以轻松更换数据库, 而不需要修改代码.缺点 : 相比较直接使用SQL语句操作数据库,有性能损失.根据对象的操作转换成SQL语句,根据查询的结果转化成对象, 在映射过程中有性能损失.Flask-SQLAlchemy flask默认提供模型操作但是并没有提供ORM所以一般开发的时候我们会采用flask-SQLAlchemy模块来实现ORM操作。 SQLAlchemy是一个关系型数据库框架它提供了高层的 ORM 和底层的原生数据库的操作。flask-sqlalchemy 是一个简化了 SQLAlchemy 操作的flask扩展。 SQLAlchemy: https://www.sqlalchemy.org/ 安装 flask-sqlalchemy pip install flask-sqlalchemy 如果连接的是 mysql 数据库需要安装 mysqldb 驱动 pip install flask-mysqldb 安装flask-mysqldb时注意 安装 flask-mysqldb的时候python底层依赖于一个底层的模块 mysql-client模块 如果没有这个模块则会报错如下Command python setup.py egg_info failed with error code 1 in /tmp/pip-install-21hysnd4/mysqlclient/ 解决方案 apt-get install libmysqlclient-dev python3-dev运行上面的安装命令如果报错dpkg 被中断您必须手工运行 ‘sudo dpkg --configure -a’ 解决此问题。 则根据提示执行命令以下命令再次安装mysqlclientsudo dpkg --configure -aapt-get install libmysqlclient-dev python3-dev解决了mysqlclient问题以后重新安装 flask-mysqldb即可。 pip install flask-mysqldb 数据库连接设置 在 Flask-SQLAlchemy 中数据库使用URL指定而且程序使用的数据库必须保存到Flask配置对象的 SQLALCHEMY_DATABASE_URI 键中 config.py配置文件代码class Config(object):DEBUG TrueSECRET_KEY *(%#4sxcz(^(#$#8423# 数据库链接配置:#数据类型://登录账号:登录密码数据库主机IP:数据库访问端口/数据库名称SQLALCHEMY_DATABASE_URI mysql://root:123127.0.0.1:3306/flask_students 其他设置# 动态追踪修改设置如未设置只会提示警告 SQLALCHEMY_TRACK_MODIFICATIONS True #查询时会显示原始SQL语句 SQLALCHEMY_ECHO True 配置完成需要去 MySQL 中创建项目所使用的数据库$ mysql -uroot -p123 mysql create database flask_students charsetutf8mb4; 常用的SQLAlchemy字段类型 类型名python中类型说明Integerint普通整数一般是32位SmallIntegerint取值范围小的整数一般是16位BigIntegerint或long不限制精度的整数Floatfloat浮点数Numericdecimal.Decimal普通数值一般是32位Stringstr变长字符串Textstr变长字符串对较长或不限长度的字符串做了优化Unicodeunicode变长Unicode字符串UnicodeTextunicode变长Unicode字符串对较长或不限长度的字符串做了优化Booleanbool布尔值Datedatetime.date日期Timedatetime.datetime日期和时间LargeBinarystr二进制文件常用的SQLAlchemy列选项 选项名说明primary_key如果为True代表表的主键unique如果为True代表这列不允许出现重复的值index如果为True为这列创建索引提高查询效率nullable如果为True允许有空值如果为False不允许有空值default为这列定义默认值常用的SQLAlchemy关系选项 选项名说明backref在关系的另一模型中添加反向引用,用于设置外键名称,在1查多的primary join明确指定两个模型之间使用的连表条件uselist如果为False不使用列表而使用标量值order_by指定关系中记录的排序方式secondary指定多对多关系中关系表的名字secondary join在SQLAlchemy中无法自行决定时指定多对多关系中的二级连表条件数据库基本操作 在Flask-SQLAlchemy中插入、修改、删除操作均由数据库会话管理。 会话用 db.session 表示。在准备把数据写入数据库前要先将数据添加到会话中然后调用 commit() 方法提交会话。在 Flask-SQLAlchemy 中查询操作是通过 query 对象操作数据。 最基本的查询是返回表中所有数据可以通过过滤器进行更精确的数据库查询。定义模型类 我们后面会把模型创建到单独的文件中但是现在我们先把模型类写在manage.py文件中。 from flask import Flask from config import Configapp Flask(__name__,template_foldertemplates) app.config.from_object(Config)模型的创建 from flask_sqlalchemy import SQLAlchemy db SQLAlchemy(app)class Course(db.Model):# 定义表名__tablename__ tb_course# 定义字段对象id db.Column(db.Integer, primary_keyTrue)name db.Column(db.String(64), uniqueTrue)price db.Column(db.Numeric(6,2))# repr()方法类似于django的__str__用于打印模型对象时显示的字符串信息def __repr__(self):return Course:%s% self.nameclass Student(db.Model):__tablename__ tb_studentid db.Column(db.Integer, primary_keyTrue)name db.Column(db.String(64), uniqueTrue)email db.Column(db.String(64),uniqueTrue)age db.Column(db.SmallInteger)sex db.Column(db.Boolean,default1)def __repr__(self):return Student:%s % self.nameclass Teacher(db.Model):__tablename__ tb_teacherid db.Column(db.Integer, primary_keyTrue)name db.Column(db.String(64), uniqueTrue)def __repr__(self):return Teacher:%s % self.nameapp.route(/) def index():return okif __name__ __main__:app.run() 模型之间的关联 一对多 class Course(db.Model):...teacher_id db.Column(db.Integer, db.ForeignKey(tb_teacher.id))class Teacher(db.Model):...# 课程与老师之间的关联courses db.relationship(Course, backrefteacher, lazysubquery)... 其中realtionship描述了Course和Teacher的关系。第一个参数为对应参照的类Course第二个参数backref为类Teacher申明新属性的方法第三个参数lazy决定了什么时候SQLALchemy从数据库中加载数据 如果设置为子查询方式(subquery)则会在加载完Teacher对象后就立即加载与其关联的对象这样会让总查询数量减少但如果返回的条目数量很多就会比较慢 设置为 subquery 的话teacher.courses 返回所有当前老师关联的课程列表另外,也可以设置为动态方式(dynamic)这样关联对象会在被使用的时候再进行加载并且在返回前进行过滤如果返回的对象数很多或者未来会变得很多那最好采用这种方式 设置为 dynamic 的话Teacher.courses返回查询对象并没有做真正的查询可以利用查询对象做其他逻辑比如先排序再返回结果多对多 achievement db.Table(tb_achievement, db.Column(student_id, db.Integer, db.ForeignKey(tb_student.id)), db.Column(course_id, db.Integer, db.ForeignKey(tb_course.id)) )class Course(db.Model):...students db.relationship(Student,secondaryachievement, backrefcourses, lazydynamic) class Student(db.Model):... 常用的SQLAlchemy查询过滤器 过滤器说明filter()把过滤器添加到原查询上返回一个新查询filter_by()把等值过滤器添加到原查询上返回一个新查询limit()使用指定的值限定原查询返回的结果offset()偏移原查询返回的结果返回一个新查询order_by()根据指定条件对原查询结果进行排序返回一个新查询group_by()根据指定条件对原查询结果进行分组返回一个新查询常用的SQLAlchemy查询结果的方法 方法说明all()以列表形式返回查询的所有结果first()返回查询的第一个结果如果未查到返回Nonefirst_or_404()返回查询的第一个结果如果未查到返回404get()返回指定主键对应的行如不存在返回Noneget_or_404()返回指定主键对应的行如不存在返回404count()返回查询结果的数量paginate()返回一个Paginate对象它包含指定范围内的结果创建和删除表 创建表 db.create_all() # 注意create_all()方法执行的时候需要放在模型的后面 # 上面这段语句后面我们需要转移代码到flask-script的自定义命令中。 # 执行了一次以后需要注释掉。 删除表 db.drop_all() 数据操作 添加一条数据 student1 Student(namexiaoming) db.session.add(student1) db.session.commit() #再次插入一条数据 student2 Role(namexiaohong) db.session.add(student2) db.session.commit() 一次插入多条数据 st1 Student(namewang,emailwang163.com,age22) st2 Student(namezhang,emailzhang189.com,age22) st3 Student(namechen,emailchen126.com,age22) st4 Student(namezhou,emailzhou163.com,age22) st5 Student(nametang,emailtang163.com,age22) st6 Student(namewu,emailwugmail.com,age22) st7 Student(nameqian,emailqiangmail.com,age22) st8 Student(nameliu,emailliu163.com,age22) st9 Student(nameli,emailli163.com,age22) st10 Student(namesun,emailsun163.com,age22) db.session.add_all([st1,st2,st3,st4,st5,st6,st7,st8,st9,st10]) db.session.commit() filter_by精确查询 例如返回名字等于wang的所有人 Student.query.filter_by(namexiaoming).all() first()返回查询到的第一个对象【first获取一条数据,all获取多条数据】 Student.query.first() all()返回查询到的所有对象 Student.query.all() filter模糊查询返回名字结尾字符为g的所有数据。 Student.query.filter(Student.name.endswith(g)).all() get():参数为主键如果主键不存在没有返回内容 Student.query.get() 逻辑非返回名字不等于wang的所有数据 Student.query.filter(Student.name!wang).all() not_ 相当于取反 from sqlalchemy import not_ Student.query.filter(not_(Student.namewang)).all() 逻辑与需要导入and返回and()条件满足的所有数据 from sqlalchemy import and_ Student.query.filter(and_(Student.name!wang,Student.email.endswith(163.com))).all() 逻辑或需要导入or_ from sqlalchemy import or_ Student.query.filter(or_(Student.name!wang,Student.email.endswith(163.com))).all() 查询数据后删除 student Student.query.first() db.session.delete(student) db.session.commit() 更新数据 student Student.query.first() student.name dong db.session.commit() 关联查询 假设老师和课程的关系是一对多的关系一个老师可以授课多个课程一个课程只由一个老师授课。 查询老师授课的所有课程#查询讲师表id为1的老师 teacher Teacher.query.get(1) #查询当前老师的所有课程, 根据模型中关联关系来查询数据 print(teacher.courses) 查询课程所属讲师course Course.query.get(2)print(course)# 根据外键只能查询到ID数值, SQLAlchemy不会帮我们把ID转换成模型 print( course.teacher_id )# 要获取外键对应的模型数据,需要找到主键模型里面的 db.relationship 里面的 backref print( course.teacher.name ) 数据库迁移 在开发过程中需要修改数据库模型而且还要在修改之后更新数据库。最直接的方式就是删除旧表但这样会丢失数据。更好的解决办法是使用数据库迁移框架它可以追踪数据库模式的变化然后把变动应用到数据库中。在Flask中可以使用Flask-Migrate扩展来实现数据迁移。并且集成到Flask-Script中所有操作通过命令就能完成。为了导出数据库迁移命令Flask-Migrate提供了一个MigrateCommand类可以附加到flask-script的manager对象上。首先要在虚拟环境中安装Flask-Migrate。 pip install flask-migrate 代码文件内容 from flask import Flask from config import Config from flask_migrate import Migrate,MigrateCommand from flask_script import Manager,Commandapp Flask(__name__,template_foldertemplates) app.config.from_object(Config)manage Manager(app)模型的创建 from flask_sqlalchemy import SQLAlchemy db SQLAlchemy(app)#第一个参数是Flask的实例第二个参数是Sqlalchemy数据库实例 migrate Migrate(app,db)#manager是Flask-Script的实例这条语句在flask-Script中添加一个db命令 manage.add_command(db,MigrateCommand)# 多对多的关系 # 关系表的声明方式 achieve db.Table(tb_achievement,db.Column(student_id, db.Integer, db.ForeignKey(tb_student.id)),db.Column(course_id, db.Integer, db.ForeignKey(tb_course.id)) )class Course(db.Model):# 定义表名__tablename__ tb_course# 定义字段对象id db.Column(db.Integer, primary_keyTrue)name db.Column(db.String(64), uniqueTrue)price db.Column(db.Numeric(6,2))teacher_id db.Column(db.Integer, db.ForeignKey(tb_teacher.id))students db.relationship(Student, secondaryachieve, backrefcourses, lazysubquery)# repr()方法类似于django的__str__用于打印模型对象时显示的字符串信息def __repr__(self):return Course:%s% self.nameclass Student(db.Model):__tablename__ tb_studentid db.Column(db.Integer, primary_keyTrue)name db.Column(db.String(64), uniqueTrue)email db.Column(db.String(64),uniqueTrue)age db.Column(db.SmallInteger,nullableFalse)sex db.Column(db.Boolean,default1)def __repr__(self):return Student:%s % self.nameclass Teacher(db.Model):__tablename__ tb_teacherid db.Column(db.Integer, primary_keyTrue)name db.Column(db.String(64), uniqueTrue)# 课程与老师之间的多对一关联courses db.relationship(Course, backrefteacher, lazysubquery)def __repr__(self):return Teacher:%s % self.nameapp.route(/) def index():return okif __name__ __main__:manage.run() 创建迁移版本仓库 #这个命令会创建migrations文件夹所有迁移文件都放在里面。 python main.py db init 创建迁移版本 自动创建迁移版本有两个函数 upgrade()函数把迁移中的改动应用到数据库中。downgrade()函数则将改动删除。自动创建的迁移脚本会根据模型定义和数据库当前状态的差异生成upgrade()和downgrade()函数的内容。对比不一定完全正确有可能会遗漏一些细节需要进行检查python main.py db migrate -m initial migration# 这里等同于django里面的 makemigrations生成迁移版本文件 升级版本库的版本 python main.py db upgrade 降级版本库的版本 python main.py db downgrade 版本库的历史管理 可以根据history命令找到版本号,然后传给downgrade命令: python manage.py db history输出格式base - 版本号 (head), initial migration 回滚到指定版本 python manage.py db downgrade # 默认返回上一个版本 python manage.py db downgrade 版本号 # 返回到指定版本号对应的版本 数据迁移的步骤 1. 初始化数据迁移的目录 python manage.py db init2. 数据库的数据迁移版本初始化 python manage.py db migrate -m initial migration3. 升级版本[创建表/创建字段/修改字段] python manage.py db upgrade 4. 降级版本[删除表/删除字段/恢复字段] python manage.py db downgrade 模块推荐 文档: https://faker.readthedocs.io/en/master/locales/zh_CN.html github: https://github.com/joke2k/faker flask-session 允许设置session到指定存储的空间中, 文档: 安装命令: https://pythonhosted.org/Flask-Session/ pip install flask-Session 使用session之前,必须配置一下配置项: SECRET_KEY *(%#4sxcz(^(#$#8423 # session秘钥 redis保存session的基本配置 配置文件信息 import redis class Config(object):DEBUG TrueSECRET_KEY *(%#4sxcz(^(#$#8423# 数据库链接配置:#数据类型://登录账号:登录密码数据库主机IP:数据库访问端口/数据库名称SQLALCHEMY_DATABASE_URI mysql://root:123127.0.0.1:3306/flask_students# 设置mysql的错误跟踪信息显示SQLALCHEMY_TRACK_MODIFICATIONS True# 打印每次模型操作对应的SQL语句SQLALCHEMY_ECHO True# 把session保存到redis中# session存储方式为redisSESSION_TYPEredis# 如果设置session的生命周期是否是会话期, 为True则关闭浏览器session就失效SESSION_PERMANENT False# 是否对发送到浏览器上session的cookie值进行加密SESSION_USE_SIGNER False# 保存到redis的session数的名称前缀SESSION_KEY_PREFIX session:# session保存数据到redis时启用的链接对象SESSION_REDIS redis.Redis(host127.0.0.1, port6379) # 用于连接redis的配置 主文件信息main.py代码: from flask import Flask from config import Config from flask_session import Session from flask import session app Flask(__name__,template_foldertemplates) app.config.from_object(Config)Session(app)app.route(/) def index():return okapp.route(/set_session) def set_session():设置sessionsession[username] 小明return okif __name__ __main__:app.run() SQLAlchemy存储session的基本配置 需要手动创建session表在项目第一次启动的时候使用db.create_all()来完成创建。 db SQLAlchemy(app)app.config[SESSION_TYPE] sqlalchemy # session类型为sqlalchemy app.config[SESSION_SQLALCHEMY] db # SQLAlchemy对象 app.config[SESSION_SQLALCHEMY_TABLE] session # session要保存的表名称 app.config[SESSION_PERMANENT] True # 如果设置为True则关闭浏览器session就失效。 app.config[SESSION_USE_SIGNER] False # 是否对发送到浏览器上session的cookie值进行加密 app.config[SESSION_KEY_PREFIX] session: # 保存到session中的值的前缀Session(app) 转载于:https://www.cnblogs.com/Sunzz/p/10979970.html
http://www.zqtcl.cn/news/900196/

相关文章:

  • 凡科快速建站建设网站遇到问题的解决方案
  • 深圳市公司网站建设公司十大互联网营销公司
  • 免费发布推广信息的网站百度招聘2022年最新招聘
  • 建站公司怎么获客任县附近网站建设价格
  • 泰兴市淘宝网站建设指数 网站权重
  • 烟台市做网站找哪家好才艺多网站建设
  • nginx wordpress 重写seo技术大师
  • 公司网站建设需要什么科目上海服务政策调整
  • 如何免费搭建自己的网站网站建设公司swot分析
  • 太原网站优化技术如何开发一款app软件
  • 莆田做网站公司lnmp wordpress 404
  • 网站开发中的qq登录网站地图有什么作用
  • 南宁小程序开发网站建设公司网络营销方案设计范文
  • 电脑做网站主机空间哈尔滨人才招聘信息网
  • 无锡网站建设制作设计wordpress news list
  • 专业建站教程青海 网站开发 图灵
  • 济南网站公司哪家好中国建设银行电脑版
  • 企业网站建设定制网站建设成功案例怎么写
  • 一个网站做数据维护3天正常吗做sgs认证公司网站
  • 免费网络短剧网站摄影素材库网站
  • 如何做竞价网站数据监控网站建设企业的市场分析
  • 电脑做网站主机空间软件开发工作岗位
  • 计算机多媒体辅助教学网站开发响应式网站建设精英
  • 免费网站空间怎么做网站主持人
  • 开源建站系统有哪些网站信息化建设合同
  • 昆明云南微网站淄博专业网站建设
  • 古典网站源码海南app开发
  • 自己做网站前期困难吗怎么早网站上放广告
  • 建设银行招标网站南昌网站建设公司信息
  • 网站建设与管理专业介绍湖南长沙邮政编码