创建三个表
1.商品表
id, 商品名,库存,单价
2.买家表
id, 用户名,余额
3.购物日志表
id, 购物记录
需求1:
添加商品信息:
商品:鞋 库存:10 价格:1000
添加用户信息:
用户:Jack 金额:10000
不考虑用户余额,不考虑商品库存。
完成一次购物
需求2:
考虑商品库存,考虑金额问题。
完成一次购物
·
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
# 链接数据库
# create_engine:创建引擎
# "数据库类型 + 数据库依赖://user:passwd@host/db"
db = sqlalchemy.create_engine("mysql + pymsql://root:0615@localhost/0813lianxi")
# 创建一个继承基类(父类)
# sqlalchemy的固定语法
Base = declarative_base(db)
# 映射商品表(将表名映射为类名,将字段映射为属性)
class Commodity(Base):
# sqlalchemy的固定写法,使用Django的ORM时,就不需要设置表名。表名就是类名
# 在此处__tablename__就是表名
__tablename__ = "student"
# Column(字段的意思)
# Integer就是sql中的int类型,主键可写可不写,设置之后自动自增
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
# String就是sql中的varchar类型,一定不要忘了给参数
name = sqlalchemy.Column(sqlalchemy.String(32))
num = sqlalchemy.Column(sqlalchemy.Integer)
price = sqlalchemy.Column(sqlalchemy.Integer)
# 映射买家表
class Person(Base):
__tablename__ = "person"
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
name = sqlalchemy.Column(sqlalchemy.String(32))
money = sqlalchemy.Column(sqlalchemy.Integer)
# 映射购物日志表
class Log(Base):
__tablename__ = "log"
id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True)
# msg:message的缩写。此处是记录用户购物信息字段
msg = sqlalchemy.Column(sqlalchemy.String(32))
如果数据库没有此表,执行以下代码
if __name__ == "__main__":
# 映射创建所有的表
Base.metadata.create_all(db)
·
完善数据库信息:
from sqlalchemy.orm import sessionmaker
# 绑定一个查询实例
# 绑定的是上面链接的数据库,得到的返回值是一个类
Session = sessionmaker(bind=db)
# 通过类创建一个实例
session = Session()
# 创建实例对象
commodity = Commodity(
# 此处id在上方设置了自增长,所以不需要再给值
name="特步",
num=100,
price=500
)
person = Person(
name="Jack",
money=10000
)
# 添加数据
# add()是单个数据的添加。
# add_all()是多个数据的添加,多个数据的添加必须是列表存储
session.add_all([commodity, person])
# 每操作完成异步,都需要进行提交事务。否则不会及对数据库中进行更新
session.commit()
——————————————————————————————————————————————————————————————————
完成需求一:
# 得到的返回值可能是对象、可能是列表
# 为了保证返回值是一个数据。所以需要.first()
# 当然也可以通过get(id)的方法得到对象
p = session.query(Person).filter(Person.id==1).first()
c = session.query(Commodity).filter(Commodity.di==1).first()
# 为保证后面的程序正常执行,我们最好还是反查一下
print(p)
print(c)
p.money -= 500
c.num -= 1
log = Log(
msg="用户:{},购买了商品:{},剩余金额:{},商品库存:{}。".formart(p.name, c.name, p.money, c.num)
)
# 将修改后的数据更新到数据库
session.merge(p)
session.merge(c)
session.add(log)
# 提交事务
session.commit()
·
完成需求二:
def main():
person = session.query(Person).filter(Person.name == "Jack").first()
# 如果没有叫"Jack"的用户
if person is None:
return
commodity = session.query(Commodity).filter(Commodity.name == "特步").first()
# 如果没有叫"特步"的商品
if commodity is None:
return
# 如果用户钱不够或者商品库存没有了
if person.money < commodity.price or commodity.num <= 0:
return
person.money -= commodity.price()
commodity.num -= 1
log = Log(
msg="用户:{},购买了商品:{},剩余金额:{},商品库存:{}。".formart(p.name, c.name, p.money, c.num)
)
session.merge(person)
session.merge(commodity)
session.add(log)
# 执行提交,如果提交不了,就回滚
try:
session.commit()
except:
session.rollback()
if __name__ == "__main__":
main()