sqlalchemy的练习

本文通过Python的SQLAlchemy ORM库实现了一个简单的电商购物场景,包括创建商品、买家和购物日志表,以及如何在考虑商品库存和买家余额的情况下完成购物过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建三个表

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值