flask-sqlalchemy操作(基础)

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

模型类

# 用户表
class User(db.Model):
    __tablename__ = 'user'
    uid = db.Column(db.String(32), primary_key=True, nullable=False)
    username = db.Column(db.String(20), nullable=True)
    password = db.Column(db.String(128), nullable=True)
    email = db.Column(db.String(30), nullable=True)
    addresses = db.relationship('Address', backref='user')


# 地址信息
class Address(db.Model):
    __tablename__ = 'address'
    aid = db.Column(db.String(32), primary_key=True, nullable=False)
    name = db.Column(db.String(32), nullable=True)
    site = db.Column(db.String(100), nullable=True)
    phone = db.Column(db.Integer, nullable=True)
    uid = db.Column(db.String(32), db.ForeignKey('user.uid'))


# 关联表
OrderItem = db.Table(
    'orderitem',
    db.Column('gid', db.String(32), nullable=True),
    db.Column('product_id', db.String(32), db.ForeignKey('product.pid')),
    db.Column('order_id', db.String(32), db.ForeignKey('order.oid'))
)


# 商品信息
class Product(db.Model):
    __tablename__ = 'product'
    pid = db.Column(db.String(32), nullable=False, primary_key=True)
    pname = db.Column(db.String(50), nullable=True)
    market_price = db.Column(db.Float, nullable=True)
    shop_price = db.Column(db.Float, nullable=True)
    pimage = db.Column(db.String(200), nullable=True)
    pdate = db.Column(db.Date, nullable=True)
    is_hot = db.Column(db.Integer, nullable=True)
    pdesc = db.Column(db.String(255), nullable=True)
    pflag = db.Column(db.Integer, nullable=True)
    order = db.relationship('Order', secondary=OrderItem)


# 订单表
class Order(db.Model):
    __tablename__ = 'order'
    oid = db.Column(db.String(32), nullable=False, primary_key=True)
    count = db.Column(db.Integer, nullable=True)
    subtotal = db.Column(db.Float, nullable=True)
    ordertime = db.Column(db.DateTime, nullable=True)
    flag = db.Column(db.String(10), nullable=True)

一对一

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

一对多

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

多对多

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

一对一

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

一对多

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

多对多

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

一对一

good = models.Product.query.filter_by(pid=pid).first() # 获取
good.pflag = 6  # 修改
models.db.session.commit() # 提交

一对多

u = models.User.query.get(1)
    for i in u.addresses:
        i.name = 'Gage'
models.db.session.commit()

多对多

o = models.Order.query.get(1)
    for i in o.product:
        i.pname = 'Gage'
models.db.session.commit()

一对一

add = models.Address.query.filter_by(aid=aid).first() # 获取
models.db.session.delete(add) # 添加
models.db.session.commit() # 提交

一对多

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

多对多

# 实际开发也是如此,即只删除依赖
# 根据商品删除所依赖的订单
p = models.Product.query.get(1)
o = models.Order.query.get(1)
p.order.remove(o)
models.db.session.commit()
# 根据订单删除所关联的商品
p = models.Product.query.get(1)
o = models.Order.query.get(1)
o.product.remove(p)
models.db.session.commit()
    原文作者:嘉美伯爵
    原文地址: https://segmentfault.com/a/1190000017893187
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞