### SQLAlchemy完成mysql数据库表的增、删、查、改操作案例
##### 1.安装
```
pip install sqlalchemy -i https://mirrors.aliyun.com/pypi/simple
pip install pymysql -i https://mirrors.aliyun.com/pypi/simple
python -m venv myenv
source myenv/bin/activate # 对于Linux/macOS
myenv\Scripts\activate # 对于Windows
pip install gdal
conda安装 https://blog.youkuaiyun.com/ks2686/article/details/139183535
1.conda activate 报错 CondaError: Run ‘conda init‘ before ‘conda activate‘
解决 source activate
然后 conda activate myenv
停止 conda deactivate
conda 安装 gdal https://blog.youkuaiyun.com/ylfmsn/article/details/129544359
conda环境创建 https://blog.youkuaiyun.com/potato123232/article/details/118419642
```
>
from sqlalchemy import Column, String, Integer, create_engine, func
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import sessionmaker
import json
# 引入或逻辑关键字or_
from sqlalchemy import or_
# 与逻辑(and_)
from sqlalchemy import and_
# 申明基类对象
Base = declarative_base()
# 数据库连接初始化
class MysqlSqlalchemy(object):
def __init__(self):
# 创建mysql连接引擎
self.engine = create_engine('mysql+pymysql://root:123456@localhost:3306/wow?charset=utf8')
# 比较好的习惯是现实销毁引擎,会有助于python的垃圾回收
self.engine.dispose()
# 创建表
Base.metadata.create_all(self.engine, checkfirst=True)
# 创建mysql的session连接对象
self.session = sessionmaker(bind=self.engine)()
# 定义user表实体对象
class User(Base):
# 定义表名
__tablename__ = 'user'
# 定义字段
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(255))
age = Column(Integer)
class Address(Base):
# 定义表名
__tablename__ = 'address'
# 定义字段
user_id = Column(Integer, primary_key=True, autoincrement=True)
address = Column(String(255))
if __name__ == '__main__':
# 初始化mysql数据库连接,获取session
session = MysqlSqlalchemy().session
# 11.新增一条数据
# try:
# # 开始一个新的事务
# session.begin()
# user1 = User(name='xiaoming11', age=2333)
# user2 = User(name='xiaoming21', age=233)
# session.add(user1)
# session.add(user2)
# # 提交事务,将所有更改保存到数据库
# session.commit()
# except Exception as e:
# # 如果在添加用户过程中发生错误,则回滚事务
# session.rollback()
# print(f"An error occurred: {e}")
# finally:
# # 关闭会话
# session.close()
# 22.新增多条数据
# datas = [
# User(name='张三', age=20),
# User(name='李四', age=21),
# User(name='王五', age=22),
# ]
# session.add_all(datas)
# session.commit()
# 33.查询user用户表中的全部数据
# result = session.query(User.id, User.name, User.age).all() #查询所有
# result = session.query(User).filter(User.name.like("%xiaoming")).all()
# def user_to_dict(user): # 11.定义一个方法来将 User 对象转换为字典
# return {
# 'id': user.id,
# 'name': user.name,
# 'age': user.age
# }
# # 将查询结果转换为字典列表
# users_dict = [user_to_dict(user) for user in result]
# print(users_dict)
# # 将字典列表转换为 JSON 对象数组
# users_json = json.dumps(users_dict, ensure_ascii=False)
# # 打印 JSON 对象数组
# print(users_json)
# ----------------------------------------------------------->
# 1 返回模糊查询的所有结果名字
# for user in result:
# print(user.name)
# 2 如果你想要返回的是一个具体的属性列表,比如每个用户的 ID,你可以这样修改:
# user_ids = [user.id for user in result]
# print(user_ids)
# 3模糊查询有多少条记录是xiaoming的数据
# result = session.query(User).filter(User.name.like("%xiaoming")).count()
# result = session.query(func.count(User.age)).scalar() #4 统计多少条记录
# print(result)
# 4.更新user用户表中的数据-方式一
# 先查询用户id为1的数据
# user_id = 1
# query_user = session.query(User).filter_by(id=user_id).first()
# # 更新用户id为1的数据
# query_user.name = "赵六"
# query_user.age = 25
# # 提交修改
# session.commit()
# 5.更新user用户表中的数据-方式二 使用update()方法直接更新字段值
# user_id = 1
# session.query(User).filter(User.id == user_id).update({User.name: "王五", User.age: 18})
# session.commit()
# 6.根据id删除一条user表中用户数据
# 根据id删除数据
# user_id = 1
# del_count = session.query(User).filter(User.id == user_id).delete()
# print('删除数目:', del_count)
# session.commit()
# # 7 查询id不为1、3、5的记录,结果包含id为2、4的两条记录
# result = session.query(User).filter(~User.id.in_([1, 3, 5])).all()
# # 定义一个方法来将 User 对象转换为字典
# def user_to_dict(user):
# return {
# 'id': user.id,
# 'name': user.name,
# # 添加其他字段...
# }
# # 将查询结果转换为字典列表
# users_dict = [user_to_dict(user) for user in result]
# # 将字典列表转换为 JSON 对象数组
# users_json = json.dumps(users_dict, ensure_ascii=False)
# # 打印 JSON 对象数组
# print(users_json)
# 8.直接在filter中添加多个条件即表示与逻辑
# result = session.query(User).filter(User.name == 'xiaoming', User.age == 23).all()
# for user in result:
# print(user.name, user.age)
# 9. 或逻辑or 查询title是Engineer或者salary为3000的记录,返回结果为id为1、2、3、4的记录
# result = session.query(User).filter(or_(User.name == 'xiaoming', User.age == 233)).all()
# for user in result:
# print(user.name, user.age)
# 10. 用and_进行逻辑查询
# result = session.query(User).filter(and_(User.name == 'xiaoming', User.age == 233))
# for user in result:
# print(user.name, user.age)
# 11.批量插入新增
# objects = [User(name="u1", age=11), User(name="u2", age=4), User(name="u3", age=76)]
# session.add_all(objects)
# session.commit()
# 12.删除单条记录
# user3 = session.query(User).filter_by(name='u1').first()
# session.delete(user3)
# session.commit()
# 13.删除多条记录
# users = session.query(User).filter(User.name.in_(['u3', 'u2'])).all()
# for user in users:
# session.delete(user)
# session.commit()
# 14.多表关联查询
# query = session.query(User, Address).join(Address, User.id == Address.user_id)
# for user in query.all():
# print(user[0].name)
# 15.多表关联查询 将查询用户表里面id=2的在地址表对应user_id=2的数据
# 定义一个方法来将 User 和 Address 对象转换为字典
# def user_address_to_dict(user, address):
# return {
# 'user_id': user.id,
# 'user_name': user.name,
# 'address': address.address,
# }
# result = session.query(User, Address).join(Address, User.id == Address.user_id).all()
# # 将查询结果转换为字典列表
# results_dict = []
# for user, address in result:
# if user.id == 2:
# results_dict.append(user_address_to_dict(user, address))
# # 将字典列表转换为 JSON 对象数组
# results_json = json.dumps(results_dict, ensure_ascii=False)
# # 打印 JSON 对象数组
# print(results_json) #[{"user_id": 2, "user_name": "xiaoming", "address": "xxxxx"}]