范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

盘点Flask与数据库的交互插件(FlaskSqlalchemy)

  来源:Python爬虫与数据挖掘
  作者:Python进阶者
  大家好,我是Python进阶者。
  前言
  在我们做web开发的时候,经常需要用到与数据库交互,因为我们的数据通常都是保存在数据库中的,如果有人需要访问,就必须与数据库访问,所以今天我们介绍一个Flask中与数据库交互的插件---Flask-Sqlalchemy。一、安装并导入pip install flask-sqlalchemy   from flask_sqlalchemy import SQLAlchemy import os import pymysql as p from flask import Flask二、基本用法
  今天我们要了解的是Mysql数据库,所以这里重点介绍连接Mysql数据库的方法。
  1.连接数据库
  1).写在配置文件中然后读取
  首先创建一个配置文件"config.py",内容为:db_type="mysql" db_conn="pymysql" host="127.0.0.1" username="root" password="123456" port="3306" db_name="people" SQLALCHEMY_DATABASE_URI="{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(db_type,db_conn,username,password,host,port,db_name) SQLALCHEMY_COMMIT_ON_TEARDOWN=False SQLALCHEMY_TRACK_MODIFICATIONS=True
  然后在应用中导入配置文件:from flask_sqlalchemy import SQLAlchemy from flask import Flask import config app=Flask(__name__) app.config.from_object(config) # 连接数据库配置文件 db=SQLAlchemy(app) db.create_all()  # 创建所有的数据库
  2).直接写在应用中读取app=Flask(__name__) p.install_as_MySQLdb()   # mysql连接器,因为不支持py3版本,所以必须加上这行 app.config["SECRET_KEY"]=os.urandom(50) app.config["SQLALCHEMY_DATABASE_URI"]="mysql+pymysql://root:123456@127.0.0.1:3306/people" app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"]=True   # 每次请求结束后都会自动提交数据库中的变动 app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True  # 动态追踪修改设置,如未设置只会提示警告 db = SQLAlchemy(app)
  还有许多其它的配置参数,比如:SQLALCHEMY_NATIVE_UNICODE    # 可以用于显式禁用原生 unicode 支持 SQLALCHEMY_POOL_SIZE         # 数据库连接池的大小,默认是引擎默认值(5)  SQLALCHEMY_POOL_TIMEOUT      # 设定连接池的连接超时时间,默认是 10 SQLALCHEMY_POOL_RECYCLE      # 多少秒后自动回收连接,mysql默认为2小时 SQLALCHEMY_RECORD_QUERIES    # 可以用于显式地禁用或启用查询记录 SQLALCHEMY_ECHO              # 为Ture时用于调试,显示错误信息 SQLALCHEMY_BINDS             # 一个映射 binds 到连接 URI 的字典
  3).使用独特的创建引擎from sqlalchemy import create_engine # echo参数为True时,会显示每条执行的SQL语句,为False时关闭 engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/people",echo=True) engine.connect()
  这样我们就算与People数据库建立连接了,接下来我们来建立一张表。
  4).创建连接多个数据库app.config["SQLALCHEMY_BINDS"]={ "users": "mysql+pymysql://root:123456@127.0.0.1:3306/user",     "admin": "sqlite://C:/Users/Administrator/Desktop/admin",     "buy":   "postgresql://root:123321@127.0.0.1/buy" }
  然后引用表:db.create_all(bind=["users"]) db.create_all(bind="admin")
  指定Users数据库中的表:__bind_key__ = "users" bind key 内部存储在表的 info 字典中  即:info={"bind_key": "users"}
  2.建立数据表并插入值
  1).继承"db.Model"类from flask_sqlalchemy import SQLAlchemy from flask import Flask import config app=Flask(__name__) app.config.from_object(config) # 添加配置文件 db=SQLAlchemy(app) class User(db.Model):     __tablename__="users"     id=db.Column(db.Integer, primary_key=True,autoincrement=True) # 整数类型的自增主键     username=db.Column(db.String(100),nullable=False)  # 字符类型不为空     password=db.Column(db.String(100),nullable=False)  # 字符类型不为空       def __init__(self,username,password):         self.username=username         self.password=password       def __repr__(self):         # 打印当前类名和它的实例化后的值         return " %s is %r" %(self.__class__.__name__,self.username)            # 请求钩子,第一次请求之前执行 @app.before_first_request def create_table():      db.drop_all()  # 删除所有表     db.create_all() # 创建新的表        @app.route("/") def create():     use1= User("hwhrr", "123321")       use2= User("hwzjj", "123456")     use3= User("hwzzz", "654321")     db.session.add_all([use1,use2,use3]) # 添加所有的用户,添加一个用户去掉_all后面加一个元祖即可      db.session.commit()  # 提交数据     return use1.__repr__() # 返回用户1的值   if __name__ == "__main__":       app.run(debug=True)
  Column        参数列表   name          列名 type_         类型 *args         列表参数 Constraint(约束), ForeignKey(外键), ColumnDefault(默认), Sequenceobjects(序列)定义 key         列名的别名 primary_key 如果为True,则是主键 nullable    如果是True,则可以为null default     设置默认值,默认是None index       是否是索引,默认是True unique      是否唯一键,默认是False onupdate    指定一个更新时候的值 autoincrement 设置为整型自动增长 quote         如果列明是关键字,则强制转义,默认False
  2).利用原始引擎来创建会话(稍微复杂点) from flask import Flask from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String app=Flask(__name__) Base = declarative_base() # 创建连接数据库的引擎并且打开回显 engine = create_engine("mysql+pymysql://root:123456@localhost/people",echo=True) Session = sessionmaker(bind=engine) # 创建会话标记 class User(Base):     __tablename__ = "article"     id = Column(Integer, primary_key=True,autoincrement=True)     username = Column(String(100),nullable=False)     password = Column(String(100),nullable=False)     def __init__(self, username,password):         self.username = username         self.password=password     def __repr__(self):         return " %s is %r" %(self.__class__.__name__,self.username)      @app.before_first_request def create_table():     Base.metadata.drop_all(engine) # 删除所有数据库     Base.metadata.create_all(engine) # 创建所有数据库      @app.route("/") def index():     user= User("hwhrr","123321")     session = Session()   # 创建会话     session.add(user)  # 添加内容     session.commit()  # 提交     return user.__repr__()   if __name__ == "__main__":       app.run(debug=True)
  3.数据库之间的关系
  1). 一对一
  只需让两张表都在同等的位置上,属于双向关系。 class father(db.Model):     __tablename__="Father"     id=db.Column(db.Integer, primary_key=True,autoincrement=True)     name= db.Column(db.String(100),nullable=False)     age= db.Column(db.Integer,nullable=False)     #主要是要在一个表上设置uselist 然后设置back_populates的值为其它表的映射返回值     son_fa=db.relationship("son",uselist=False, back_populates="fa_son")      def __init__(self,name,age):         self.name=name         self.age=age     def __repr__(self):         return "%s is %r"%(self.__class__.__name__,self.name)     class son(db.Model):     __tablename__="Son"     id=db.Column(db.Integer, primary_key=True,autoincrement=True)     name= db.Column(db.String(100),nullable=False)     age= db.Column(db.Integer,nullable=False)     # 这里无需设置uselist     fa_son=db.relationship("father",back_populates="son_fa")     def __init__(self,name,age):         self.name=name         self.age=age     def __repr__(self):         return "%s is %r"%(self.__class__.__name__,self.name)
  2).一对多
  我们需要建立一个主表和一个子表,分别命名为"father"和‘son’,然后需要建立外键和反射来互相引用建立一种关系,我们来看看: class father(db.Model):     __tablename__="Father"     id=db.Column(db.Integer, primary_key=True,autoincrement=True)     name= db.Column(db.String(100),nullable=False)     age= db.Column(db.Integer,nullable=False)     # 表示另一端是son这个模型,backref可替代Father.id访问father模型     son_fa=db.relationship("son",backref="fa",lazy="dynamic")     # lazy表示加载方式:     # dynamic:动态加载,只有用到了才加载 只可以用在一对多和多对多关系中     # subquery:全部加载     def __init__(self,name,age):         self.name=name         self.age=age     def __repr__(self):         return "%s is %r"%(self.__class__.__name__,self.name)     class son(db.Model):     __tablename__="Son"     id=db.Column(db.Integer, primary_key=True,autoincrement=True)     name= db.Column(db.String(100),nullable=False)     age= db.Column(db.Integer,nullable=False)     f_id=db.Column(db.Integer,db.ForeignKey("Father.id")) # 建立外键关联,指明表名和字段     def __init__(self,name,age):         self.name=name         self.age=age             def __repr__(self):         return "%s is %r"%(self._class__.__name__,self.name)   @app.route("/") def create():     use1= father("hw", 45)     use2= son("hyy", 20)     db.session.add_all([use1,use2])     db.session.commit()     return use1.__repr__()+" "+use2.__repr__()
  3).多对一
  就是将反射应用在子表上,与父表同时进行关联。 class father(db.Model):     __tablename__="Father"     id=db.Column(db.Integer, primary_key=True,autoincrement=True)     name= db.Column(db.String(100),nullable=False)     age= db.Column(db.Integer,nullable=False)     # 表示另一端是son这个模型     son_fa=db.relationship("son", back_populates="fath")      def __init__(self,name,age):         self.name=name         self.age=age     def __repr__(self):         return "%s is %r"%(self.__class__.__name__,self.name)     class son(db.Model):     __tablename__="Son"     id=db.Column(db.Integer, primary_key=True,autoincrement=True)     name= db.Column(db.String(100),nullable=False)     age= db.Column(db.Integer,nullable=False)     f_id=db.Column(db.Integer,db.ForeignKey("Father.id")) # 建立外键关联     # 表示另一端是father这个模型     fa_son=db.relationship("father",back_populates="so")      def __init__(self,name,age):         self.name=name         self.age=age     def __repr__(self):         return "%s is %r"%(self.__class__.__name__,self.name)
  4).多对多
  设置一个关联表来对两个表同时进行管理。 # 设置关联表 gl=db.Table("glb",     db.Column("id",db.Integer,primary_key=True,autoincrement=True),     db.Column("son_id",db.Integer,db.ForeignKey("Son.id")),     db.Column("father_id",db.Integer,db.ForeignKey("Father.id")) )   # 父表 class father(db.Model):     __tablename__="Father"     id=db.Column(db.Integer, primary_key=True,autoincrement=True)     name= db.Column(db.String(100),nullable=False)     age= db.Column(db.Integer,nullable=False)     # 设置关联表 动态加载     son_fa=db.relationship("son",secondary=gl,backref="fas",lazy="dynamic")     def __init__(self,name,age):         self.name=name         self.age=age     def __repr__(self):         return "%s is %r"%(self.__class__.__name__,self.name)   # 子表 class son(db.Model):     __tablename__="Son"     id=db.Column(db.Integer, primary_key=True,autoincrement=True)     name= db.Column(db.String(100),nullable=False)     age= db.Column(db.Integer,nullable=False)     def __init__(self,name,age):         self.name=name         self.age=age     def __repr__(self):         return "%s is %r"%(self.__class__.__name__,self.name)
  可以看出我们已经创建出了一张关联表,名字就是我们设置的"glb"。
  4.查看数据
  1).查看全部数据(all)father.query.all()
  2).精准查询(filter_by)father.query.filter_by(name="hw").all()  # 查找所有名字为hw的记录
  3).模糊查询(filter)father.query.filter(father.name.startswith("h").all() # 查找所有名字首字母为h的记录
  4).主键查询(get)father.query.get(1) # 查看id为1的记录
  5).取反操作(not_)from sqlalchemy import not_ father.query.filter(not_(father.name=="hw")).all() # 查找所有除了名字不是hw的记录
  6).与操作(and_)from sqlalchemy import and_ # 查找名字末尾是h并且年龄等于50的记录 father.query.filter(and_(father.name.endswith("h"),father.age==50)).all()
  7).或操作(or_)from sqlalchemy import or_ # 查找名字末尾是h或者年龄等于50的记录 father.query.filter(or_(father.name.endswith("h"),father.age==50)).all()
  8).一对多正向查询son.query.filter_by(f_id=2).all()
  9).一对多反向查询son.query.filter_by(fa=use1).all()
  10).查询第一个出现的数据son.query.filter(son.age==10).first() son.query.filter(son.age==10)[0]
  11).查询对象并返回指定数量的结果son.query.filter(son.age==10).limit(10).all() # 返回十个查找到的对象
  12).查询时指定偏移量son.query.filter(son.age==10).offset(2).all() # 返回偏移了2的对象
  13).查找对象并排序son.query.filter(son.age==10).order_by(son.create_time.desc()).all() # 返回按降序排序的记录
  14).查找对象返回分组结果son.query.filter(son.age==10).group_by(son.name).all() # 返回age为10的名字对象分组
  15).返回查询结果的数量son.query.filter(son.age==10).count() # son的年龄为10的数量
  16).返回切片结果son.query(son).slice(10,40).all()   # son从10到40的记录 son.query(son)[10:40]
  17).分页获取数据p=request.args.get("p") # 从请求的查询字符串中获取当前页面,返回一个每页显示3条记录的分页对象 paginate=son.query.paginate(p=int(p),per_page=3)  paginate 属性: pages     # 总共生成页面数量 page      # 当前页数 has_next  # 判断是否有下一页 has_prev  # 判断是否有上一页 next_num  # 获取下一页的页码数 prev_num  # 获取上一页的页码数 items     # 获取当前页的记录 total     # 查询返回的记录总数
  18).查询仅显示一条记录son.query(son).one()
  5.更新数据ss=son.query.get(1) ss.name="fasd"     # 更改name的值来达到更新的目的 db.session.commit()
  6.删除数据ss=son.query.get(1) db.session.delete(ss) db.session.commit()三、总结
  Sqlalchemy支持很多表的建立和操作,通过对它的了解,我们可以很方便的操作数据库的数据从而与前端页面交互达到可视化的效果,通过这篇文章的学习,相信你可以独立开发一个小网站了。

如何看待小米12Ultra因使用圆形后摄被称为保时泰?小米公司出厂的小米手机,一直被大家称为国货之光,因为当年它凭借着比较低的价格和配置能够达到那些四五千手机的性能,除了容易发烧发烫以外没有什么别的毛病。最近小米公司的小米12Ultr为什么要选择Web3?它有什么好处?原文链接httpsmedium。comapi3whyweb3whatisitgoodfor6ed1c4036220作者RyanBoder译者iguana翻译机构WhaleDaoWeAndroid开发之路多线程前言多线程作为Android开发中相对而言较为高阶的知识,其中用到相关的知识点是非常的多,所以在我们需要进行设计或者写多线程的代码就必须要进行相对谨慎的处理,这样就由必要对其要有着特斯拉ModelYP的真正对手来了,阿维塔011MMW,黑武士对决仔细看标题了吗?再认真看一遍,没有错,是特斯拉ModelYPerfromance高性能全能驱动版,不是单电机的modelY!它的真正对手来了阿维塔011MMW!(MMW是时尚先锋品小米手机配置很高,性价比也很高,为何品牌排名却并不高?说起手机,大家自然会想起华为荣耀小米一加努比亚OPPO和vivo三星和苹果等,其中国产手机主要就是华为小米荣耀一加手机等,OPPO和vivo手机的主要幕后老板和大股东之一是段永平,从生物学的角度来预估病毒的变异方向众所周知,世界上病毒无处不在,但绝大多数我们并不理会,一则传染性不强,二则是致病性不强,二者但凡占其一,都会引起重视。然而,针对病毒自身,是否会导致宿主生病或死亡并不重要,易传播易在线人数超20万!上派新品发布会圆满成功,开启智能嵌入时代耀时代未来派,4月11日晚1930,上派新品发布会盛大开启,众人期盼已久的上派嵌入式集成灶终于揭开了神秘面纱,引爆热议,直播间人数超20万,人气爆棚!据悉,上派集成灶历时两年,广泛关注蔚来宣布涨价!ES8ES6及EC6车型将于5月10日起上调1万元文懂车帝原创彩丽美懂车帝原创行业4月10日,蔚来官方宣布,受今年以来全球原材料价格持续大幅上涨的影响,2022年5月10日起,蔚来将对旗下产品价格进行适当调整。据了解,此次公布的价新车特斯拉Cybertruck量产版亮相,明年与RoadsterSemi一同投产文懂车帝原创曹浩懂车帝原创产品日前,特斯拉得州工厂正式开业,首批ModelY也正式交付。而除了ModelY之外,特斯拉其他车型也一并亮相,这其中也包括了Cybertruck量产版,支付宝新版本发布,上线一个实用功能,界面可以更精简支付宝作为国内最重要的移动支付平台之一已经成为人们日常生活中必不可少的一部分,但是支付宝在为大家带来便利的同时也会时不时地遭遇一些网友的吐槽,其中吐槽最多的一个原因就是支付宝的功能中国科研再下一城!华为逆势增长力克三星,夺欧洲专利榜首海外传来最新好消息!日前,欧洲专利局发布了2021年专利指数,公开了来自全球各公司各实体的欧洲专利申请榜单,其中,中国企业的科研专利表现非常亮眼,华为中兴小米等多家中国科技企业互联
用户界面开发框架Qt6。x入门级教程创建基于QtWidget的应用(三)QtitanRibbon官方最新版免费下载试用,历史版本下载,在线文档和帮助文件下载慧都网完成Header文件textfinder。h文件已经包含必要的include构造函数析构函Python中的虚拟环境和包管理Python中的虚拟环境虚拟环境是独立的Python环境,有自己的sitepackages。基本上,这意味着每个虚拟环境都有自己的一组对第三方软件包的依赖。如果在同一台机器上开发多氢能利用再添安全卫士新型传感器实现氢气秒级响应声表面波氢气传感器的技术优势在于快速响应与高灵敏度。声表面波技术本身对表面负载表现出极高的灵敏度和快速响应特点。将之与特异选择性的氢敏材料相结合,利用传感过程中的气体吸附效应对声表科大讯飞大举招聘自动驾驶人才,意欲何为?来源盖世汽车Vivi自动驾驶的快速发展,正吸引越来越多新玩家的关注和加入。据知情人士透露,目前科大讯飞智能汽车事业部也在大举招聘自动驾驶相关的人才。随后盖世汽车查询科大讯飞官网发现etcd集群在线扩展需求原etcd集群5个节点node1,node2,node3,node4,node5现扩展到9个节点node6,node10,node11,node12生成kubeadm配置文件E京东的二手优品,怎么样?个人觉得比咸鱼啥的靠谱多了。按照京东官方的说法,京东优品销售的均是非全新3C电子产品,包括手机平板笔记本等,这些二手商品来源于国内专业回收机构,保证为正品,并且没有翻新。值得注意的6000件数字藏品周边一天售罄,爱奇艺如何布局元宇宙?2021年称得上是元宇宙元年。去年7月Facebook改名Meta,让元宇宙概念大热随后谷歌腾讯字节跳动阿里巴巴等众多国内外顶级互联网公司,都纷纷踏入这一赛道,数家公司都在陆续上线南极的警告!开花植物在南极蔓延,这不是好事,人类真的要警惕了南极,是地球上环境最恶劣的地区之一,除了岩石的颜色之外,白色成为了这里的主流颜色。然而在白色身影之下,科学家们发现,开花植物南极珍珠草和南极海棠在南极地区开始蔓延,它们在南极地区迅蓬涞数据完成近2亿元A轮融资,云启资本蓝驰创投领投文福布斯中国2月23日,数字化医院运营管理平台蓬涞数据宣布完成近2亿元A轮融资,由云启资本蓝驰创投领投,联想之星博将资本交大校友基金和飞马基金跟投。本轮融资将主要用于进一步产品研发到底还要不要学习Winform?到底还要不要学习Winform?俗话说术业有专攻,这个问题取决于你是否从事相关方向的开发工作!如果你从事的windows桌面类软件开发工作,那么绝对有必要掌握winform,如果你未来几年必将消失的行业或职业是什么?因为经常看科幻片,所以就想到了这个问题。科技日新月异,创新永无止境。我们要与时俱进,就不得不正视这个问题。对于制造业,特别是很多高新企业来说,车间早已实现全自动无人化管理,所以体力