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

Python操作MySQL的两种姿势:原生SQL与ORM框架SQLAlchemy详解

‍今天详细讲解一下在 Python 中连接 MySQL 数据库的几种主流方法。这将是一个从基础到进阶的完整指南。

核心库选择

在 Python 中连接 MySQL,主要有两个流行的驱动:

1.  mysql-connector-python: MySQL 官方提供的纯 Python 驱动。无需其他依赖,安装简单。

2.  PyMySQL: 一个纯 Python 的 MySQL 客户端,兼容性很好,非常流行。

3.  (底层驱动) MySQLdb: 一个 C 扩展模块,速度很快,但在 Python 3 上安装可能较麻烦,通常被 PyMySQL 替代。

对于现代项目,PyMySQL 和 mysql-connector-python 是最常见的选择。本指南将以 `PyMySQL` 和 `SQLAlchemy` 为例。

方法一:使用 PyMySQL 直接连接(基础方法)

这种方式提供了最直接的 SQL 操作,适合需要完全控制 SQL 语句的场景。

1. 安装库

```bash

pip install pymysql

```

2. 基本连接与操作流程

完整的操作流程遵循 连接 -> 创建游标 -> 执行SQL -> 提交 -> 关闭 的步骤。

```python

import pymysql

from pymysql.cursors import DictCursor 可选,用于获取字典格式的结果

1. 建立数据库连接

connection = pymysql.connect(

    host='localhost',      数据库服务器地址,本地可用 localhost 或 127.0.0.1

    user='your_username',  用户名

    password='your_password', 密码

    database='your_database_name', 要连接的数据库名

    charset='utf8mb4',     字符集,支持中文和表情符号推荐 utf8mb4

    cursorclass=DictCursor 可选:设置游标类型,返回字典而非元组

)

try:

    2. 创建一个游标对象,用于执行SQL语句

    with connection.cursor() as cursor:

        示例1: 执行一条 SELECT 查询

        sql = "SELECT `id`, `name` FROM `users` WHERE `email` = %s"

        cursor.execute(sql, ('user@example.com',)) 使用参数化查询,防止SQL注入!

        

        获取结果

        result = cursor.fetchone() 获取单条记录

        print(result) 如果是DictCursor,输出: {'id': 1, 'name': 'John'}

        如果用默认游标,输出: (1, 'John')

        

        获取所有记录

        results = cursor.fetchall()

        for row in results:

           print(row)

    示例2: 执行一条 INSERT 语句

    with connection.cursor() as cursor:

        sql = "INSERT INTO `users` (`name`, `email`) VALUES (%s, %s)"

        cursor.execute(sql, ('Alice', 'alice@example.com'))

    

    3. 提交事务!对于INSERT/UPDATE/DELETE等写操作,必须提交才会生效。

    connection.commit()

    示例3: 获取刚插入数据的主键ID

    with connection.cursor() as cursor:

        sql = "INSERT INTO `users` (`name`, `email`) VALUES (%s, %s)"

        cursor.execute(sql, ('Bob', 'bob@example.com'))

        connection.commit()

        print(f"新插入记录的ID是: {cursor.lastrowid}")

finally:

    4. 关闭连接,释放资源

    connection.close()

```

3. 使用上下文管理器 (推荐)

为了确保连接总是能被正确关闭,即使发生异常,推荐使用 `with` 语句。

```python

import pymysql

使用 with 语句自动管理连接和游标的关闭

try:

    with pymysql.connect(host='localhost', user='root', password='password', database='test') as conn:

        with conn.cursor() as cursor:

            cursor.execute("SELECT VERSION()")

            result = cursor.fetchone()

            print(f"Database version: {result[0]}")

        连接结束时,如果没有异常,会自动 commit(); 如果有异常,会自动 rollback()

except pymysql.Error as e:

    print(f"Database error: {e}")

```

 方法二:使用 SQLAlchemy (ORM 框架,进阶方法)

ORM (Object-Relational Mapping) 允许你使用 Python 类和对象来操作数据库,而不是直接写 SQL。这对于大型、复杂的项目非常有益,可以提高开发效率和代码可维护性。

1. 安装

```bash

pip install sqlalchemy pymysql

```

2. 核心组件与连接

```python

from sqlalchemy import create_engine, Column, Integer, String

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.orm import sessionmaker

1. 定义数据库连接字符串

格式: dialect+driver://username:password@host:port/database

DB_URI = 'mysql+pymysql://username:password@localhost:3306/your_database?charset=utf8mb4'

2. 创建引擎 (Engine),它是ORM和数据库的连接核心

engine = create_engine(DB_URI, echo=True) echo=True 会打印执行的SQL,调试时有用

3. 创建基类

Base = declarative_base()

4. 定义映射类(模型)

class User(Base):

    __tablename__ = 'users' 指定映射的表名

    id = Column(Integer, primary_key=True, autoincrement=True)

    name = Column(String(50), nullable=False)

    email = Column(String(100), unique=True)

5. 创建所有表(如果不存在)

Base.metadata.create_all(engine)

6. 创建会话工厂 (Session)

Session = sessionmaker(bind=engine)

7. 使用会话进行增删改查

新增数据

with Session() as session:

    new_user = User(name='Charlie', email='charlie@example.com')

    session.add(new_user)

    session.commit() 提交事务

    print(f"New user ID: {new_user.id}") 提交后,id自动赋值

查询数据

with Session() as session:

    查询所有用户

    users = session.query(User).all()

    for user in users:

        print(user.id, user.name, user.email)

    条件查询

    user = session.query(User).filter_by(name='Charlie').first()

    if user:

        print(f"Found user: {user.name}")

```

 最佳实践与重要提示

1.  安全第一:永远使用参数化查询

    错误做法(SQL注入风险): `cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")`

    正确做法: `cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))`

    PyMySQL 使用 `%s` 作为占位符,即使数据是数字或日期。

2.  管理敏感信息

    切勿将数据库密码等硬编码在代码中!

    使用环境变量或配置文件(如 `.env` 文件)来管理。

    示例(使用 `python-dotenv`):

        ```bash

        pip install python-dotenv

        ```

        ```python

        .env 文件

        DB_HOST=localhost

        DB_USER=root

        DB_PASSWORD=your_secure_password

        DB_NAME=my_app

        ```

        ```python

        app.py

        from dotenv import load_dotenv

        import os

        import pymysql

        load_dotenv() 加载 .env 文件中的环境变量

        connection = pymysql.connect(

            host=os.getenv('DB_HOST'),

            user=os.getenv('DB_USER'),

            password=os.getenv('DB_PASSWORD'),

            database=os.getenv('DB_NAME')

        )

        ```

3.  连接管理

    数据库连接是昂贵的资源,一定要确保在使用后正确关闭。强烈推荐使用 `with` 语句上下文管理器。

4.  选择策略

    简单脚本、需要精细控制SQL:选择 PyMySQL 或 mysql-connector-python。

    Web应用、复杂业务逻辑、希望代码更Pythonic:选择 SQLAlchemy ORM。

另外搭配便捷的MYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。


文章转载自:

http://ubRLor3i.jLxLd.cn
http://y57PYznb.jLxLd.cn
http://8dfnhStZ.jLxLd.cn
http://bpIIg865.jLxLd.cn
http://UU4J437f.jLxLd.cn
http://asR2tuX9.jLxLd.cn
http://fSkNnEii.jLxLd.cn
http://5Hkx4IXk.jLxLd.cn
http://pcXHHqmW.jLxLd.cn
http://EtvxIFYW.jLxLd.cn
http://BcSvqX9O.jLxLd.cn
http://IKPUeyUk.jLxLd.cn
http://OsFVGAvr.jLxLd.cn
http://NskR9J7N.jLxLd.cn
http://Tq6PLbbH.jLxLd.cn
http://mj3rSn7F.jLxLd.cn
http://splvQIcw.jLxLd.cn
http://j0Dk9GTp.jLxLd.cn
http://9tN0yWkd.jLxLd.cn
http://KfycC72m.jLxLd.cn
http://okczx02N.jLxLd.cn
http://TvJrNVQB.jLxLd.cn
http://iKKKDs6T.jLxLd.cn
http://ByG380BT.jLxLd.cn
http://vdUfUuKk.jLxLd.cn
http://pn1eD5Br.jLxLd.cn
http://qIpBpagQ.jLxLd.cn
http://4GgsIZAz.jLxLd.cn
http://2c59JeMO.jLxLd.cn
http://pUrnNOeR.jLxLd.cn
http://www.dtcms.com/a/371383.html

相关文章:

  • TypeScript 核心语法与 Vue2 指令知识点
  • Java 14 开箱,新特性Record、instanceof、switch香香香香
  • HarmonyOS 应用开发新范式:深入探索 Stage 模型与 ArkUI 声明式开发
  • 跳转原生系统设置插件 支持安卓/iOS/鸿蒙UTS组件
  • 5-2EFCore性能优化
  • 《sklearn机器学习——管道和复合估计器》联合特征(FeatureUnion)
  • 大数据毕业设计选题推荐-基于大数据的贵州茅台股票数据分析系统-Spark-Hadoop-Bigdata
  • C++ 容器——unordered_xxx
  • 常见设计模式详解
  • 网络爬虫(web crawler)
  • 319章:使用Scrapy框架构建分布式爬虫
  • (LeetCode 面试经典 150 题) 67. 二进制求和(位运算、字符串)
  • 【linux kernel 常用数据结构和设计模式】【数据结构 3】【模拟input子系统input_dev和input_handler之间的多对多关系】
  • 怎么用CXL加速数据库?· SIGMOD‘25
  • Day23_【机器学习—聚类算法—K-Means聚类 及评估指标SSE、SC、CH】
  • Uniapp 怎么修改项目图标和启动页
  • macos安装openjdk17
  • 像素图生成小程序开发全解析:从图片上传到Excel图纸
  • 运维服务方案,运维巡检方案,运维安全保障方案文件
  • 计算机网络相关
  • 【代码讲解】北通手柄遥控 + Mujoco 仿真 SO-ARM100 机械臂末端位姿
  • ARM 体系结构
  • 云平台面试内容(一)
  • React Hooks 钩子
  • js逆向之JSEncrypt的加密
  • Balabolka:免费高效的文字转语音软件
  • 第3天-Jenkins详解-3
  • Linux内核进程管理子系统有什么第四十三回 —— 进程主结构详解(39)
  • Apache 2.0 开源协议详解:自由、责任与商业化的完美平衡-优雅草卓伊凡
  • 【iOS】多界面传值