flask再学习-思考之怎么从数据库中查询数据在页面展示!

flask再学习-思考之怎么从数据库中查询数据在页面展示!

2023年7月20日发(作者:)

flask再学习-思考之怎么从数据库中查询数据在页⾯展⽰!看别⼈视频觉得很简单,要⾃⼰做蒙蔽了!这样⼦。NO!1. 流程:⾸先要有和数据库连接的驱动!⼀般有PYMySQL mysqlclient 等使⽤扩展Flask-SQLAlchemy 获得orm对象重点在于ORM对象的使⽤:2:使⽤ flask-sqlacodegen 扩展 ⽅便快速⽣成 ORM model 2.1 :pip install flask-sqlacodegen 2.2 使⽤⽅法 ⽣成所有表的对象:     flask-sqlacodegen mysql://root:@127.0.0.1/food_db --outfile "common/models/" --flask  ⽣成某个表的对象:    flask-sqlacodegen mysql://root:@127.0.0.1/food_db --tables user --outfile "common/models/" --flask  注意:在window下mysql的部分不要加 ‘ ’ ,在Mac环境下要加 ‘ ’

3: 修改⾃动⽣成的model中的db变量 from application import db4:修改配置⽂件

SQLALCHEMY_DATABASE_URI = 'mysql://root:对应root的密码@127.0.0.1/food_db'5:开始写代码了

【前⾔】使⽤python处理mysql数据库相关的业务,⼀般都是使⽤库MySQLdb直接调⽤sql语句。感觉很low,换⼀个SQLAlchemy上⼿。不但是耍酷,之前些flask代码时就很惊讶基本看不到对数据库的操作,其使⽤的就是修改过的SQLAlchemy,好处是直接操作数据库表对象,即ORM对象关系映射管理,性能会慢些,但在1-2倍的时间,在可以接受的范围。安装pip install sqlalchemypip install --egg mysql-connector-python-rfpip install sqlacodegen⽣成models1. ⽅法⼀: ⾃⼰根据SQLAlchemy的写model,⽐如⼀对多,多对⼀等复杂的表模型。(SQLAlchemy的⽂档⾮常详细,就跟天书⼀样,真⼼懒得看。还是简洁明了,可以参考的)2. ⽅法⼆: 使⽤sqlacodegen从数据库逆向出$ sqlacodegen --noviews --noconstraints --noindexes --outfile ./ mysql://username:password@localhost:3399/dbname

这⾥需要注意下,使⽤–noviews, –noconstraints, –noindexes,这3个选项是去掉视图,约束和所以,基本⽤不到。反之,不去带着些⽂件结构的话可能会报错,⽐如views找不到数据。数据库表-Useridnameage1‘Tom’222‘Jim’213‘Lucy’22对应的# 导⼊:from sqlalchemy import Column, String, create_enginefrom import sessionmakerfrom ative import declarative_base# 创建对象的基类:Base = declarative_base()# 定义User对象:class User(Base): # 表的名字: __tablename__ = 'user' # 表的结构: id = Column(String(20), primary_key=True) name = Column(String(20))基本使⽤⾸先要创建engine,它代表⼀种数据库连接资源。可以通过engine船舰connect和session完成事务的提交。对于使⽤或者multiprocessing的多进程应⽤来说,通常需要为紫禁城提供单独的engine。mysql:engine = create_engine('mysql://scott:tiger@localhost/test')#⽐较好的习惯是现实销毁引擎,会有助于python的垃圾回收e()

sqlite:engine = create_engine('sqlite:///')

查询记录那么我们怎么从数据库中查询数据?为此,SQLAlchemy 在您的 Model 类上提供了 query 属性。当您访问它时,您会得到⼀个新的所有记录的查询对象。在使⽤ all() 或者 first() 发起查询之前可以使⽤⽅法 filter() 来过滤记录。如果您想要⽤主键查询的话,也可以使⽤ get()。connect:connection = t()result = e("select username from users")for row in result: print("username:", row['username'])()

Session:# 创建DBSession类型:DBSession = sessionmaker(bind=engine)# 创建Query查询,filter是where条件,最后调⽤one()返回唯⼀⾏,如果调⽤all()则返回所有⾏:user = (User).filter(=='5').one()# 打印类型和对象的name属性:print 'type:', type(user)print 'name:', # 关闭Session:()使⽤更复杂的表达式查询⼀些⽤户:>>> (th('@')).all()[, ]按某种规则对⽤户排序:>>> _by(me)[, , ]

限制返回⽤户的数量:>>> (1).all()[]

⽤主键查询⽤户:>>> (1)

打印查询结果的全部元素:for u in (User).all(): print u.__dict__

插⼊记录插⼊记录ret = (),其中ret的值永远是none,不⽤看。Session:try: sess = Session() (User()) ()except t: date() raiseexcept: ck() raise删除记录删除记录是⼗分类似的,使⽤ delete() 代替 add():>>> (me)>>> ()

更改记录基本思路是先filter到需要的⾏集合,再修改⾥⾯的值。这⾥有4种⽅式:1) _of_logins += 1 ()2) (). filter(me == ). update({"no_of_logins": (_of_logins +1)}) ()3) conn = t() stmt = (). values(_of_logins = (_of_logins + 1)). where(me == ) e(stmt)4) setattr(user, 'no_of_logins', _of_logins+1) ()事务事物就是有⼀系列动作⼀⽓呵成,如果中间失败了,前⾯的动作不会⽣效。满⾜ACID特性。最简单的例⼦就是转账,我给你转10块钱后台需要做两件事,先在我账户中减去10,再在你的账户⾥加10。想想如果这件事不⽤事务处理,我卡⾥减了10块钱,⽽转你钱没有成功,这⼗块钱就莫名消失了哈。connection = t()trans = ()try: r1 = e(()) e((), col1=7, col2='this is some data') ()except: #⼀旦出错就回滚 ck() ()参考⽂献

发布者:admin,转转请注明出处:http://www.yc00.com/web/1689826827a289031.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信