Files
0824Jlj/orm.py
T

141 lines
5.9 KiB
Python

from sqlalchemy import *
from sqlalchemy.orm import declarative_base,sessionmaker
from datetime import datetime
# 一、【数据库连接】
'''1.创建数据库连接引擎对象'''
db_url = "mysql+pymysql://root:123456@127.0.0.1:3306/ai0824?charset=utf8mb4"
'''mysql+pymysql://数据库用户名:密码@数据库ip地址:端口/库名?charset=字符集编码'''
engine = create_engine(db_url # 连接地址
,pool_size=50 # 连接池,同时可以保持50个已经创建好的数据库连接,放在池子里缓存使用
,echo=True # 每次python执行数据库的操作时,都会打印sql语句到控制台,一般不建议打开
)
# 二、【数据库表的创建】
'''1.创建数据库表模型的基类,用来给子类继承,使这个子类具备数据库表模型的功能'''
Base = declarative_base() # 执行函数,返回一个基类
'''2.创建表模型类'''
'''O对象class R关系 M映射数据库的表'''
'''
create table order_info_detail( id int primary key auto_increment,title varchar(50),userid int,create_date datetime,update_date datetime )
'''
class Order(Base): # python里的表名字
__tablename__ = 'order_info_detail' # 实际数据库的表名字
id = Column( Integer # 声明字段的数据类型
, primary_key=True # 声明是主键
, autoincrement=True # 声明是自增主键
, comment='订单编号,自增主键' # 注释
)
title = Column( String(50) # 对应数据库的varchar类型
,nullable=False # 不允许为null
)
acc = Column(Integer)
userid = Column( Integer
# ,ForeignKey('user_info_detail.id')
,nullable=False ) # 外键约束
create_date = Column(DATETIME
, default=datetime.now # 默认值是当前时间
)
update_date = Column(DATETIME
, default=datetime.now # 首次创建的时间跟更新时间一致
, onupdate=datetime.now
)
class User(Base): # python里的表名字
__tablename__ = 'user_info_detail' # 实际数据库的表名字
id = Column( Integer # 声明字段的数据类型
, primary_key=True # 声明是主键
, autoincrement=True # 声明是自增主键
, comment='用户编号,自增主键' # 注释
)
usernmae = Column( String(50) # 对应数据库的varchar类型
,nullable=False # 不允许为null
,comment='用户名'
)
create_date = Column(DATETIME
, default=datetime.now # 默认值是当前时间
)
update_date = Column(DATETIME
, default=datetime.now # 首次创建的时间跟更新时间一致
, onupdate=datetime.now
)
'''3.创建表'''
Base.metadata.create_all(engine) # 创建所有的表,只要数据库存在这个表了,就不会触发,也不会更新表结构
# Order.__table__.create(engine,checkfirst = True) # 单张表的创建
# 三、【表数据的新增】
'''1.实例化数据库表模型类,得到具体的数据'''
u1 = User( usernmae='清风飞扬' )
print( 'User1的属性:',u1.id,u1.usernmae,u1.create_date,u1.update_date )
u2 = User( usernmae='北大青鸟' )
print( 'User2的属性:',u2.usernmae)
'''2.将实例化好的数据,添加到数据库里'''
# 拿到数据库会话管理工具
Session = sessionmaker( bind=engine
,autoflush=False # 是否开启自动刷新python新增的数据到实际的数据库内存缓存中
,autocommit = False # 不自动提交数据,这个是真正提交到数据库磁盘永久生效的
)
db = Session() # 实例化一个数据库操作会话
db.add( u1 ) # 新增数据到数据库里
db.add( u2 )
db.commit() # 提交,永久生效,注意提交后不能回滚
# db.rollback() # 回滚,事务没有提交前,dml操作可以回滚
db.close() # 关闭数据操作会话
'''
等价于sql语句:
insert into user_info_detail(username) values('清风飞扬');
insert into user_info_detail(username) values('北大青鸟');
'''
# 四、【表数据的更改】
db = Session() # 实例化一个数据库操作会话
db.query(User)\
.filter( User.usernmae == '北大青鸟' )\
.update( {"usernmae":'沃林数智'
, "create_date":"2000-10-10"
} # 同时更新多个字段
)
db.commit()
'''
多个复合条件:
filter( 条件1,条件2,条件3.. ) # and的关系
filter( or_( 条件1,条件2), not_(条件2),and_(条件1,条件2) )
db.query(表模型).filter(条件1).filter(条件2).filter(条件3) 条件可以拼接成and的关系
or_: 函数里的条件都是 or 的关系
and_: 函数里的条件是 and 的关系
not_ : 将条件的结果进行取反
'''
# 五、【表数据的删除】
try:
db.query( User ).filter( User.usernmae == '清风飞扬' ).delete() # 只要命中就删除
db.commit()
except:
db.rollback() # 如果报错,就回滚
# 清空数据,并且重置自增主键 truncate table 表名; 无法回滚
# db.execute( text( "truncate table user_info_detail" ) ) # 直接书写原生的sql语句
# 可以select、update、delete全部支持
r1 = db.query(User).first()
print('获取单个查询结果对象:',r1)
print(r1.id,r1.usernmae,r1.create_date,r1.update_date)
r2 = db.query(User).all()
print('获取多个查询结果对象:',r2)
for i in range( len(r2) ):
print(f'第{i+1}行数据:',r2[i].id,r2[i].usernmae,r2[i].create_date,r2[i].update_date)