如下內容介紹了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()