乐趣区

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()

退出移动版