141 lines
5.9 KiB
Python
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) |