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()
相關文章
相關標籤/搜索