资讯专栏INFORMATION COLUMN

flask-sqlalchemy操作(基础)

Cciradih / 1364人阅读

摘要:以下内容介绍了的基础查询语句,下篇文章将介绍其高级查询聚合自关联连接子查询等模型类用户表地址信息关联表商品信息订单表增一对一构建对象添加对象提交事务一对多主表子表子表赋值对象添加提交多对多生成或获取商品对象生成订单对象订单表与商品表关联添加

</>复制代码

  1. 以下内容介绍了Sqlalchemy的基础查询语句,下篇文章将介绍其高级查询(聚合、自关联、连接、子查询等)
模型类

</>复制代码

  1. # 用户表
  2. class User(db.Model):
  3. __tablename__ = "user"
  4. uid = db.Column(db.String(32), primary_key=True, nullable=False)
  5. username = db.Column(db.String(20), nullable=True)
  6. password = db.Column(db.String(128), nullable=True)
  7. email = db.Column(db.String(30), nullable=True)
  8. addresses = db.relationship("Address", backref="user")
  9. # 地址信息
  10. class Address(db.Model):
  11. __tablename__ = "address"
  12. aid = db.Column(db.String(32), primary_key=True, nullable=False)
  13. name = db.Column(db.String(32), nullable=True)
  14. site = db.Column(db.String(100), nullable=True)
  15. phone = db.Column(db.Integer, nullable=True)
  16. uid = db.Column(db.String(32), db.ForeignKey("user.uid"))
  17. # 关联表
  18. OrderItem = db.Table(
  19. "orderitem",
  20. db.Column("gid", db.String(32), nullable=True),
  21. db.Column("product_id", db.String(32), db.ForeignKey("product.pid")),
  22. db.Column("order_id", db.String(32), db.ForeignKey("order.oid"))
  23. )
  24. # 商品信息
  25. class Product(db.Model):
  26. __tablename__ = "product"
  27. pid = db.Column(db.String(32), nullable=False, primary_key=True)
  28. pname = db.Column(db.String(50), nullable=True)
  29. market_price = db.Column(db.Float, nullable=True)
  30. shop_price = db.Column(db.Float, nullable=True)
  31. pimage = db.Column(db.String(200), nullable=True)
  32. pdate = db.Column(db.Date, nullable=True)
  33. is_hot = db.Column(db.Integer, nullable=True)
  34. pdesc = db.Column(db.String(255), nullable=True)
  35. pflag = db.Column(db.Integer, nullable=True)
  36. order = db.relationship("Order", secondary=OrderItem)
  37. # 订单表
  38. class Order(db.Model):
  39. __tablename__ = "order"
  40. oid = db.Column(db.String(32), nullable=False, primary_key=True)
  41. count = db.Column(db.Integer, nullable=True)
  42. subtotal = db.Column(db.Float, nullable=True)
  43. ordertime = db.Column(db.DateTime, nullable=True)
  44. flag = db.Column(db.String(10), nullable=True)
一对一

</>复制代码

  1. order = models.Orders(oid=orderid, ordertime=datetime.now(), total=pcount, uid=pid) # 构建对象
  2. models.db.session.add(order) # 添加对象
  3. models.db.session.commit() # 提交事务
一对多

</>复制代码

  1. p = models.User(uid="122", username="hello", password="123456", email="1@qq.com") # 主表
  2. c1 = models.Address(aid="1111111111",site="xxxxxxxxxx") # 子表
  3. c2 = models.Address(aid="2222222222", site="yyyyyyyyyy") # 子表
  4. p.addresses = [c1, c2] # 赋值对象
  5. models.db.session.add(p) # 添加
  6. models.db.session.commit() # 提交
多对多

</>复制代码

  1. p = models.Product(pid="1",pname="hello") # 生成或获取商品对象
  2. o = models.Order(oid="1", ) # 生成订单对象
  3. p.order = [o] # 订单表与商品表关联
  4. models.db.session.add(p) # 添加
  5. models.db.session.commit() # 提交
一对一

</>复制代码

  1. models.Product.query.get(pid) # 根据主键返回一个对象,必须查询主键
  2. models.Product.query.all() # 返回全部对象
  3. models.Product.query.filter_by(pid=pid).first() # 返回第一个对象,检索任何值均可
  4. models.Product.query.filter_by(cid="1").limit(4).all() # 限制返回对象
一对多

</>复制代码

  1. # 根据用户获取地址
  2. p = models.user.query.get(uid) # 根据主键返回一个对象,必须查询主键
  3. p.addresses # 一对多获取对象
  4. # 根据地址获取用户
  5. u = models.Address.query.get(1)
  6. print(u.user)
多对多

</>复制代码

  1. p = models.Product.query.get(1) # 正向查询
  2. print(p.order)
  3. o = models.Order.query.get(1) # 逆向查询
  4. print(o.product)
一对一

</>复制代码

  1. good = models.Product.query.filter_by(pid=pid).first() # 获取
  2. good.pflag = 6 # 修改
  3. models.db.session.commit() # 提交
一对多

</>复制代码

  1. u = models.User.query.get(1)
  2. for i in u.addresses:
  3. i.name = "Gage"
  4. models.db.session.commit()
多对多

</>复制代码

  1. o = models.Order.query.get(1)
  2. for i in o.product:
  3. i.pname = "Gage"
  4. models.db.session.commit()
一对一

</>复制代码

  1. add = models.Address.query.filter_by(aid=aid).first() # 获取
  2. models.db.session.delete(add) # 添加
  3. models.db.session.commit() # 提交
一对多

</>复制代码

  1. # 根据用户删除地址
  2. # cascade="all" 添加此属性会级联删除
  3. # 用户一个用户对应多个地址,因此需要循环遍历,实际开发需使用filter_by 或 filter进行过滤特定删除
  4. u = models.User.query.get(1)
  5. for i in u.addresses:
  6. print(i.aid)
  7. models.db.session.delete(i)
  8. models.db.session.commit()
  9. # 根据地址删除用户
  10. a = models.Address.query.get(1)
  11. models.db.session.delete(a.user)
  12. models.db.session.commit()
多对多

</>复制代码

  1. # 实际开发也是如此,即只删除依赖
  2. # 根据商品删除所依赖的订单
  3. p = models.Product.query.get(1)
  4. o = models.Order.query.get(1)
  5. p.order.remove(o)
  6. models.db.session.commit()
  7. # 根据订单删除所关联的商品
  8. p = models.Product.query.get(1)
  9. o = models.Order.query.get(1)
  10. o.product.remove(p)
  11. models.db.session.commit()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43017.html

相关文章

  • Flask Web Development —— 数据库(上)

    摘要:数据库关系数据库将数据保存在表中来模拟应用程序中不同的实体。这些行之间的连接称作关系,也是关系数据库模型的基础。就像这个示例中看到的那样,关系数据库存储数据高效且避免重复。最好的例子就是,支持一组关系数据库引擎,包括流行的和。 数据库就是有组织的存储应用程序数据,然后查询检索指定需要的那部分。大部分web应用程序都采用基于关系模型的数据库,也称作结构化查询语言(SQL)数据库。但是最近...

    skinner 评论0 收藏0
  • Flask扩展之flask-sqlalchemy(上)

    摘要:查询记录在调试或测试模式自动启用。可以用于显式禁用原生支持。当使用不合适的指定无编码的数据库默认值时,这对于一些数据库适配器是必须的比如上某些版本的。这对是必要的,它默认移除闲置多于小时的连接。注意如果使用了,自动设定这个值为小时。 flask-sqlalchemy是flask的一个ORM扩展框架,这个扩展在sqlalchemy的进行的扩展,更方便的结合Flask.什么是ORM?其是O...

    KaltZK 评论0 收藏0
  • Flask Web Development —— 数据库(上)

    摘要:数据库关系数据库将数据保存在表中来模拟应用程序中不同的实体。这些行之间的连接称作关系,也是关系数据库模型的基础。就像这个示例中看到的那样,关系数据库存储数据高效且避免重复。最好的例子就是,支持一组关系数据库引擎,包括流行的和。 数据库就是有组织的存储应用程序数据,然后查询检索指定需要的那部分。大部分web应用程序都采用基于关系模型的数据库,也称作结构化查询语言(SQL)数据库。但是最近...

    rockswang 评论0 收藏0
  • Flask 插件系列 - Flask-SQLAlchemy

    摘要:程序中最常用的莫过于关系型数据库了,也称数据库。对象是类的实例,表示程序使用的数据库。本文由发表于个人博客,采用自由转载保持署名非商用禁止演绎协议发布。非商业转载请注明作者及出处。本文标题为插件系列本文链接为更多阅读 简介 Web 开发中,一个重要的组成部分便是数据库了。Web 程序中最常用的莫过于关系型数据库了,也称 SQL 数据库。另外,文档数据库(如 mongodb)、键值对数据...

    LoftySoul 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<