当前位置: 首页 > news >正文

Python 连接 MySQL 及 SQL增删改查(主要使用sqlalchemy)

目录

一、环境

二、MySQL的连接和使用

2.1方式一:sql为主

2.1.1创建连接

2.1.2 表结构

2.1.3 新增数据

​编辑

2.1.4 查看数据

​编辑

2.1.5 修改数据

2.1.6 删除数据

2.2方式二:orm对象关系映射

2.2.1 mysql连接

2.2.2 创建表

2.2.3 新增数据

​编辑

2.2.4 查询数据

2.2.5 修改数据

​编辑

2.2.6 删除数据


一、环境

工作中需要用到python和mysql数据库,本次文档记录相关操作。

环境:windows10、python 3.11.7

mysql版本:5.7

二、MySQL的连接和使用

本人使用过的两种方式

2.1方式一:sql为主

2.1.1创建连接
import sqlalchemy
from sqlalchemy.orm import scoped_session, sessionmakerUSERNAME = "root"  # 用户名
PASSWORD = "123456"  # 密码
ADDR = "localhost"  # 连接地址 本地localhost 服务器就是服务器的地址XXX
PORT = "3306"  # mysql端口号
DATABASE = "test"  # 连接的数据库名class MysqlSession:def __init__(self):self.create_connection()def create_connection(self):engine = sqlalchemy.create_engine(f"mysql+pymysql://{USERNAME}:{PASSWORD}@{ADDR}:{PORT}/{DATABASE}?charset=utf8",max_overflow=50,  # 超过连接池大小外最多创建的连接pool_size=50,  # 连接池大小pool_recycle=30  # 多久之后对线程池中的线程进行一次连接的回收(重置),, echo=False)self.connection = scoped_session(sessionmaker(bind=engine))def get_connection(self):return self.connectiondef ins(self, sql):  # 新增数据return self.connection.execute(sql).lastrowiddef arr(self, sql):  # 查询多条数据return self.connection.execute(sql).fetchall()def obj(self, sql):  # 查询单个数据return self.connection.execute(sql).fetchone()def upd(self, sql):  # 修改单个数据return self.connection.execute(sql)def dlt(self, sql):  # 删除数据return self.connection.execute(sql)def commit(self):self.connection.commit()  # 提交self.connection.remove()  # 结束会话
2.1.2 表结构

2.1.3 新增数据
mysql_session = MysqlSession()
connection = mysql_session.get_connection()
table_name = 'test.user'  # 表名(这里是数据库名+表名)
# 新增数据,返回的该条数据的id
name_remark = [{'name': 'Alice', 'remark': '可能是个女生'},{'name': 'Bob', 'remark': "可能是个男生"},{'name': 'Tammi'}
]
new_ids = []
for p in name_remark:name = p.get('name')remark = p.get('remark')sql = f"""insert into {table_name} (name,remark) values ('{name}','{remark}')"""user_id = mysql_session.ins(sql)new_ids.append(user_id)
print(new_ids)
mysql_session.commit()
2.1.4 查看数据
# 查看所有数据
sql = f"""select * from {table_name}"""
users = mysql_session.arr(sql)
for u in users:print(u)
# 查看指定数据
sql = f"""select * from {table_name} where name='Alice'"""
user = mysql_session.obj(sql)
print(user)

2.1.5 修改数据
# 修改指定数据
sql = f"""update {table_name} set name='Alice_changed' where id=16"""
mysql_session.upd(sql)
mysql_session.commit()
# 查看刚才修改的数据
sql = f"""select * from {table_name} where id=16 """
user = mysql_session.obj(sql)
print(user)

2.1.6 删除数据
# 删除指定数据
sql = f"""delete from {table_name} where id=16"""
mysql_session.dlt(sql)
mysql_session.commit()
# 查看所有数据
users = show_test(mysql_session, table_name)
print(users)

2.2方式二:orm对象关系映射

因为现目前工作中没有用到这个(以前用django的时候有用到过orm),这里就简单记录一下测试情况。

2.2.1 mysql连接

mysql_session.py

import sqlalchemy
from sqlalchemy.orm import sessionmakerUSERNAME = "root"  # 用户名
PASSWORD = "123456"  # 密码
ADDR = "localhost"  # 连接地址 本地localhost 服务器就是服务器的地址XXX
PORT = "3306"  # mysql端口号
DATABASE = "test"  # 连接的数据库名class MysqlSession:def __init__(self):self.create_connection()def create_connection(self):self.engine = sqlalchemy.create_engine(f"mysql+pymysql://{USERNAME}:{PASSWORD}@{ADDR}:{PORT}/{DATABASE}?charset=utf8",max_overflow=50,  # 超过连接池大小外最多创建的连接pool_size=50,  # 连接池大小pool_recycle=30,  # 多久之后对线程池中的线程进行一次连接的回收(重置),echo=False)Session = sessionmaker(bind=self.engine)self.session = Session()def get_session(self):return self.sessiondef get_engine(self):return self.engine
2.2.2 创建表

models.py

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_basefrom mysql_session import MysqlSessionBase = declarative_base()class User(Base):__tablename__ = 'person'id = Column(Integer, primary_key=True, autoincrement=True)  # 主键 自增name = Column(String(255))age = Column(Integer)engine = MysqlSession().get_engine()
Base.metadata.create_all(engine) #创建上面的表,运行一次即可

2.2.3 新增数据
from models import Person
from mysql_session import MysqlSessionsession = MysqlSession().get_session()# 新增几条数据
new_user = Person(name='张三', age=30)
session.add(new_user)
new_user = Person(name='李四', age=40)
session.add(new_user)
new_user = Person(name='王五', age=50)
session.add(new_user)
session.commit()
2.2.4 查询数据
# 查询所有数据
users = session.query(Person).all()
for user in users:print(user.name, user.age)
print("**************************************")
# 指定信息
user = session.query(Person).filter_by(name='李四').first()
print(user.name, user.age)

2.2.5 修改数据
# 修改数据
user = session.query(Person).filter_by(name='李四').first()
if user:user.age = 400  # 将年龄修改为400session.commit()print("updated success.")print(user.name, user.age)
else:print("not found.")

2.2.6 删除数据
# 删除所有年龄大于100的用户
users = session.query(Person).filter(Person.age > 100).all()
for u in users:print(u.name, u.age)
for user in users:session.delete(user)
session.commit()

相关文章:

  • 基于百度翻译API的火车头PHP翻译插件,可以翻译HTML片段
  • mybatis-plus 多租户方案1使用和坑注意事项,方案是需要实现租户功能的表都增加租户id字段
  • 【Linux多线程】线程的终止、等待和分离
  • Bond 网卡绑定技术学习
  • k8s-CCE创建工作负载变量引用
  • jquery.datetimepicker无法添加清除按钮的问题
  • eNSP学习——RIP的路由引入
  • 记录一下npm安装时的错误排查过程
  • 2024-06-06 问AI: 在深度学习中,什么是欧几里德长度?
  • QT串口调试助手V2.0(源码全开源)--上位机+多通道波形显示+数据保存(优化波形显示控件)
  • 【全开源】云调查考试问卷系统(FastAdmin+ThinkPHP+Uniapp)
  • 【C语言从入门到入土】第八章 结构体
  • 【全开源】多功能投票小程序系统源码(ThinkPHP+FastAdmin+Uniapp)
  • 软件安全技术【太原理工大学】
  • Java面向对象-方法的重写、super
  • hexo+github搭建个人博客
  • [LeetCode] Wiggle Sort
  • 【前端学习】-粗谈选择器
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 77. Combinations
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • CentOS6 编译安装 redis-3.2.3
  • Centos6.8 使用rpm安装mysql5.7
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • golang中接口赋值与方法集
  • GraphQL学习过程应该是这样的
  • SpiderData 2019年2月23日 DApp数据排行榜
  • TypeScript实现数据结构(一)栈,队列,链表
  • zookeeper系列(七)实战分布式命名服务
  • 阿里研究院入选中国企业智库系统影响力榜
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 前端攻城师
  • 如何学习JavaEE,项目又该如何做?
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 突破自己的技术思维
  • 一天一个设计模式之JS实现——适配器模式
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #07【面试问题整理】嵌入式软件工程师
  • #define
  • (11)MSP430F5529 定时器B
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (转)h264中avc和flv数据的解析
  • (转)Oracle存储过程编写经验和优化措施
  • (转)Sql Server 保留几位小数的两种做法
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET Micro Framework初体验(二)
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net wcf memory gates checking failed
  • .NET 分布式技术比较
  • .NET(C#) Internals: as a developer, .net framework in my eyes