python-26-Python ORM系列之pymysql实现对数据库的增删改查及新建表
一.简介
在Python基础系列ORM部分我们为大家介绍了如何搭建MySQL数据和MySQL一些访问配置,同时细节的同学应该已经了解到了ORM的2个库pymysql和sqlalchemy;
PyMySQL
— MySQL 数据库驱动,用于与 MySQL 数据库建立连接并执行 SQL 操作
SQLAlchemy
— ORM 框架,提供了通过 Python 类与数据库表进行交互的能力。它依赖于数据库驱动(如 PyMySQL
)来执行底层的 SQL 操作。
其实PyMySQL
在常规开发中已经具备了与MySQL数据库交互的能力,SQLAlchemy
是通过PyMySQL
来实现与数据库的交互,所以我们不要着急,好菜要慢慢上,我们先介绍PyMySQL
,好,来开始我们今天的日拱一卒!
二.安装pymysql
#使用豆瓣源安装 提升安装速度
pip install pymysql -i http://pypi.doubanio.com/simple --trusted-host pypi.doubanio.com
三.创建一个数据库
我们先用Navicat创建一个数据库,用来作为测试!
注意:
字符集:utf8mb4
排序规则:utf8mb4_0900_ai_ci
四.创建python配置文件及配置文件调用包
创建配置文件db_config.ini
在当前项目中创建config文件夹,在文件夹下db_config.ini文件,作为我们的数据库配置文件,内容如下:
[localdb]
host = localhost
user = root
password = yourpsw
port = 3306
database = myurlhub
创建配置文件调用帮助包
在当前项目中创建utils文件夹,新建__init__.py
文件,里面不用写任何东西,在utils文件夹下新建config_helper.py文件,用来帮助我们获取配置文件信息,文件内容如下:
import configparser
class Config(object):
def __init__(self, filename, encoding='UTF-8'):
# 声明配置类对象
self.config = configparser.ConfigParser()
# 读取配置文件
self.config.read(filename, encoding)
def get_value(self, section, option):
"""获取 value"""
value = self.config.get(section, option)
return value
def get_items(self, section):
value = dict(self.config.items(section))
return value
# 读取配置文件
# config.read(fileName, 'GBK')
# print(f"sections: {config.sections()}")
# print(f"options: {config.options('localdb')}")
# print(f"items: {config.items('localdb')}")
我们的整体结构文件:
五.创建我们的pymysql_helper.py 帮助程序包简化我们的调用操作
其实这时候已经可以使用pymysql来操作数据库了,但是别急因为好的程序员会创建一个帮助类库来帮助我们简化代码,和健全代码
在我们的utils文件夹下,新建pymysql_helper.py文件
#pymysql_helper.py文件
import pymysql
from utils import config_helper
import os
class PyManage:
def __init__(self):
# 加载数据库配置
config_file_path = os.path.join(os.getcwd(),'config\db_config.ini')
config = config_helper.Config(config_file_path,'UTF-8')
self.__localdb = config.get_items('localdb')
# 建立数据库连接
self.db = pymysql.connect(
host=self.__localdb['host'],
user=self.__localdb['user'],
password=self.__localdb['password'],
port=int(self.__localdb['port']), # 确保端口是整数类型
database=self.__localdb['database']
)
def execute(self, sql, params=None, commit=False):
"""
执行 SQL 查询或更新语句。根据 SQL 类型执行查询或更新。
参数:
sql (str): SQL 查询或更新语句。
params (tuple 或 dict): 可选的查询或更新参数。
commit (bool): 如果是修改数据的操作(INSERT/UPDATE/DELETE),则传入 True 来提交事务。
返回:
results: 查询结果(对于 SELECT),如果是修改操作返回影响的行数。
"""
results = None
try:
with self.db.cursor() as cursor:
# 执行 SQL 语句,使用参数化查询防止 SQL 注入
if params:
cursor.execute(sql, params)
else:
cursor.execute(sql)
# 如果是查询操作(SELECT),返回结果
if sql.strip().lower().startswith('select'):
results = cursor.fetchall()
# 如果是修改操作(INSERT/UPDATE/DELETE),提交事务
if commit:
self.db.commit()
results = True
except pymysql.MySQLError as e:
print(f"数据库操作出错: {e}")
if commit:
# 如果是修改操作出错,回滚事务
self.db.rollback()
results = False
else:
results = None
except Exception as e:
print(f"发生未知错误: {e}")
if commit:
# 如果是修改操作出错,回滚事务
self.db.rollback()
results = False
else:
results = None
return results
def close(self):
"""显式关闭数据库连接。"""
try:
if self.db.open:
self.db.close()
print("数据库连接已关闭!")
except Exception as e:
print(f"关闭数据库连接时出错: {e}")
def __del__(self):
"""析构函数,确保在对象销毁时关闭连接。"""
self.close()
整体项目的结构:
代码包 放到我的资源里面了,大家找找如果审核通过,应该可以下!
七.使用pymysql库来帮我们创建一张表
-
在主程序main.py实现以下代码
from utils import pymysql_helper db_manager = pymysql_helper.PyManage() create_table_sql = '''CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, age INT NOT NULL, email VARCHAR(255) UNIQUE NOT NULL );''' result = db_manager.execute(create_table_sql,commit=True) if result: print('执行成功!') else: print('执行失败!') db_manager.close() ''' 输出结果: 执行成功! 数据库连接已关闭! '''
来看看执行后我们的数据库:
八.使用pymysql库来给表里面新增数据
-
在主程序main.py实现以下代码
sql_insert = "INSERT INTO users (name, age,email) VALUES (%s, %s,%s)" params_insert = ('SEEONTIME', 30,'[email protected]') result = db_manager.execute(sql_insert, params_insert, commit=True) if result: print('执行成功!') else: print('执行失败!') db_manager.close() ''' 执行成功! 数据库连接已关闭! '''
来看看执行后我们的数据库:
九.使用pymysql库来查询数据
-
在主程序main.py实现以下代码
# 查询数据 sql_select = "select * from users" results = db_manager.execute(sql_select,commit=False) if results: print('执行成功!') print(results) else: print('执行失败!') db_manager.close() ''' 输出结果: 执行成功! ((1, 'SEEONTIME', 30, '[email protected]'),) 数据库连接已关闭! '''
十.使用pymysql库来修改数据
-
在主程序main.py实现以下代码
# 修改数据 sql_update = "UPDATE users SET age = %s WHERE name = %s" params = ( 35,'SEEONTIME') results = db_manager.execute(sql_update,params,commit=True) if results: print('执行成功!数据已修改。') sql_select = "select * from users" new_results = db_manager.execute(sql_select,commit=False) print(new_results) else: print('执行失败!') db_manager.close() ''' 输出结果: 执行成功!数据已修改。 ((1, 'SEEONTIME', 35, '[email protected]'),) 数据库连接已关闭! '''
十一.使用pymysql库来删除数据
-
在主程序main.py实现以下代码
# 删除数据 sql_delete = "DELETE FROM users WHERE name = %s" params = ('SEEONTIME',) results = db_manager.execute(sql_delete,params,commit=True) if results: print('执行成功!数据已删除。') sql_select = "select * from users" new_results = db_manager.execute(sql_select,commit=False) print(new_results) else: print('执行失败!') db_manager.close() ''' 输出结果: 执行成功!数据已删除。 () 数据库连接已关闭! '''
十二.总结
写到这里我们还没有实现ORM,但是已经能够利用pymysql库来帮助我们操作数据库!可能大家看到这里发现这不还是sql语言么?sql换成存储过程不又是老一套,而是使用还是不方便,查询的数据还需要我们自己来处理!
对,这个方式确实不咋地,因为好菜还在后面。。。。
代码包 放到我的资源里面了,大家找找如果审核通过,应该可以下!
标签:26,python,改查,self,db,results,pymysql,sql,print From: https://blog.csdn.net/Lookontime/article/details/143664676