首页 > 数据库 >python - mysql交互

python - mysql交互

时间:2024-12-05 17:43:49浏览次数:3  
标签:connector python mysql prepared cursor connection sql 交互

python 与 mysql 交互,能找到两个库 pymysql 和 mysql-connector-python

因为两个都是基于 DB-API 2.0 标准‌,使用上差别并不大,区别就是 mysql-connector-python 是由 Oracle 官方提供,性能可能会好一些。

安装依赖

pip install mysql-connector-python

事务(update)

import mysql.connector

# 连接到MySQL数据库
config = {
    'user': 'root',
    'password': 'root',
    'host': '127.0.0.1',
    'database': 'med'
}

connection = mysql.connector.connect(**config)


try:
    # 创建一个游标对象(等同于其它语言的 session、prepare-statement)
    cursor = connection.cursor()

    cursor.execute("INSERT INTO `med`.`t_temp` (`id`, `desc`, `sql`) VALUES ('18', '1', NULL)")

    cursor.execute("UPDATE `t_temp` SET `desc`='1' WHERE (`id`='18') LIMIT 1")

    opts = cursor.execute("DELETE FROM `t_temp` WHERE (`id`='18')")

    # 获取受影响行数
    print(cursor.rowcount)

    connection.commit()

    connection.close()
except Exception as e:
    connection.rollback()
    print(e)
    raise e
finally:
    if connection.is_connected():
        connection.close()

查询(query)

import mysql.connector

# 连接到MySQL数据库
config = {
    'user': 'root',
    'password': 'root',
    'host': '127.0.0.1',
    'database': 'med'
}

connection = mysql.connector.connect(**config)


try:
    # 创建一个游标对象
    cursor = connection.cursor()

    # 执行一个查询
    query = ("SELECT * FROM t_temp")
    opts = cursor.execute(query)

    # 获取查询结果
    for (column1, column2, column3) in cursor:
        print("{}, {}, {}".format(column1, column2, column3))

    connection.close()
except Exception as e:
    connection.rollback()
    print(e)
    raise e
finally:
    if connection.is_connected():
        connection.close()

结果集中获取字段属性

使用 cursor.description 获取属性,这个属性返回一个列表(列表元素是一个元组)。

每个元组包含以下信息:

  • 列的名称(name)
  • 列的类型(type_code)
  • 一个标识列的可选的显示宽度(display_size)
  • 列的数据类型名称(internal_size)
  • 小数点后的数字位数(precision)
  • 小数点前的数字位数(scale)
  • 列是否可以为NULL(nullable)
  • 列的列表示(column_type)

SQL 防注入

    cursor.execute("UPDATE `t_temp` SET `desc`=%s WHERE (`id`= %s) LIMIT 1",('OR 1=1', 18))

使用${}作为占位符

直接使用默认的防注入写法,因为很容易错位,实用性不佳,

你可能会想到,能不能用 ${} 作为占位符,比如:

select * from table where id=${id}

源码

如果想在 mysql-connector-python 基础上直接封装,可以参考下列方式。

更简单的做法,是直接使用 SQLAlchemy,这个库已经实现了类似的功能。

# ${} 占位符
pattern = r'\$\{([^}]+)\}'

sql_compile = re.compile(pattern)


# 执行一个 sql
def execute_sql(cursor, sql, map: dict):
    if sql is None:
        raise ValueError('sql cannot be None')

    # 入参,这里需要更强大的参数解析
    in_params = map

    # 所有占位符
    matches = re.findall(pattern, sql)

    # 预编译 sql
    prepared_sql = sql_compile.sub('%s', sql)

    logger.debug('prepared sql: ' + prepared_sql)

    prepared_params = []

    for match in matches:
        val = in_params.get(match)
        if val is None:
            raise ValueError('value is not found: ' + match)
        prepared_params.append(val)

    logger.debug('prepared params: ' + str(prepared_params))

    cursor.execute(prepared_sql, tuple(prepared_params))

使用 ORM 库

常见的有 ORM 库有:SQLAlchemy、Django ORM、SQLObject、Storm、peewee等等。

标签:connector,python,mysql,prepared,cursor,connection,sql,交互
From: https://www.cnblogs.com/chenss15060100790/p/18589061

相关文章

  • python - with
    with用法很像java中的try(){}代码块,调用对象之后,会自动执行资源释放函数。在python中,要使用with语句,需要实现两个特殊方法:__enter__和__exit__。比如:classSession:def__enter__(self):print("Enteringcontext")returnself#返回上下文管......
  • python - 安装pip插件
    功能:安装各种插件,功能与maven类似windows环境下,安装包中自带这个插件,检查路径./Scripts,如果包含pip.exe文件,则无须安装安装官网:https://pip.pypa.io/en/stable/installation/Downloadthescript,fromhttps://bootstrap.pypa.io/get-pip.py.Openaterminal/command......
  • OpenCV实现文档扫描OCR识别(基于Python + OpenCV,含完整代码)
    OpenCV文档扫描OCR识别一、引言在当今数字化时代,文档处理的自动化需求日益增长。文档扫描OCR(OpticalCharacterRecognition,光学字符识别)技术成为了将纸质文档转换为可编辑电子文本的关键手段。通过Python与OpenCV库的结合,我们能够实现高效、准确的文档扫描OCR识别。这一......
  • python学opencv|读取图像(二)保存彩色图像
    【1】引言前序学习过程中,已经掌握了读取图像的基本操作,对三个函数的功能有了基本了解:cv.imread()、cv.imshow()、cv.imwrite()学习文章链接为:python学opencv|读取图像-CSDN博客不过这篇文章里,我们获得的图像是灰度图。如果需要彩色图,那又如何处理,这就是本次课程的目的。......
  • Python 装饰器
    基本概念装饰器是一种强大的工具,允许你在不修改原有函数或方法代码的情况下,给其增加额外的功能。装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数。基本语法defmy_decorator(func):defwrapper(*args,**kwargs):print('函数运行之前')......
  • 【mysql】explain命令分析慢查询
    一、场景   在进行功能开发或者测试的时候,有时候会遇到查询较慢的问题  二、explain命令介绍https://dev.mysql.com/doc/refman/8.4/en/explain.html 三、使用 字段介绍id:查询的序列号select_type:查询的类型table:查询的表partitions:......
  • mysql索引概念以及索引底层数据结构
    一、什么是MySQL索引索引是数据库管理系统中一种用于提高数据检索效率的数据结构。通过在表的一个或多个列上创建索引,可以显著加快数据查询的速度,但会增加插入、删除和更新操作的开销。MySQL中索引的核心作用是快速定位数据位置,减少磁盘I/O操作,从而提高查询效率。索......
  • (2024最新毕设合集)基于SSM的河北省博物馆管理系统-02350|可做计算机毕业设计JAVA、PHP
    目 录摘要1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2 河北省博物馆管理系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3操作可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析......
  • 基于python爬虫的豆瓣电影推荐系统
    私信我获取源码和万字论文,制作不易,感谢点赞支持。目  录1团队建设1.1团队的任务和目标1.2团队制度1.3团队任务分配1.4项目进度安排2需求分析2.1国内外研究现状2.2研究背景与意义2.3功能分析和性能分析2.4用例图2.5类图2.6系统E-R图......
  • 停车场车位识别:基于Python和OpenCV(含完整代码)
    停车场车位识别:基于Python和OpenCV一、引言在现代城市生活中,停车场的管理效率对于解决交通拥堵和提升用户体验至关重要。停车场车位识别技术作为智能化停车场管理的核心部分,能够自动检测和识别停车场中的空闲车位,为车主提供便捷的停车引导,同时也便于停车场管理者进行资源......