跳转到内容

Python 数据库连接

来自代码酷

Python数据库连接[编辑 | 编辑源代码]

介绍[编辑 | 编辑源代码]

Python数据库连接是指在Python程序中与数据库建立通信的过程,允许开发者执行SQL查询、插入、更新和删除数据等操作。Python通过多种数据库适配器(如`sqlite3`、`psycopg2`、`MySQLdb`等)支持与关系型数据库(如SQLite、PostgreSQL、MySQL)和非关系型数据库(如MongoDB)的交互。本节将详细介绍Python中常见的数据库连接方式及其实际应用。

数据库连接的基本步骤[编辑 | 编辑源代码]

Python连接数据库通常遵循以下步骤: 1. 导入数据库适配器模块:选择适合目标数据库的Python库。 2. 建立连接:使用适配器提供的函数创建与数据库的连接。 3. 创建游标:通过连接对象创建游标(Cursor),用于执行SQL语句。 4. 执行SQL操作:通过游标执行查询或修改数据的命令。 5. 提交或回滚事务:确认更改(commit)或撤销(rollback)。 6. 关闭连接:释放资源。

常见数据库连接示例[编辑 | 编辑源代码]

SQLite[编辑 | 编辑源代码]

SQLite是Python内置的轻量级数据库,无需额外安装服务器。

import sqlite3

# 建立连接(如果数据库不存在会自动创建)
conn = sqlite3.connect('example.db')

# 创建游标
cursor = conn.cursor()

# 创建表
cursor.execute('''CREATE TABLE IF NOT EXISTS users
                  (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)''')

# 插入数据
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 25))

# 查询数据
cursor.execute("SELECT * FROM users")
print(cursor.fetchall())  # 输出: [(1, 'Alice', 25)]

# 提交更改并关闭连接
conn.commit()
conn.close()

MySQL[编辑 | 编辑源代码]

需安装`mysql-connector-python`或`PyMySQL`库。

import pymysql

# 建立连接
conn = pymysql.connect(
    host='localhost',
    user='root',
    password='password',
    database='test_db'
)

cursor = conn.cursor()
cursor.execute("SELECT VERSION()")
print(f"MySQL版本: {cursor.fetchone()[0]}")  # 输出类似: MySQL版本: 8.0.25
conn.close()

PostgreSQL[编辑 | 编辑源代码]

需安装`psycopg2`库。

import psycopg2

conn = psycopg2.connect(
    host="localhost",
    database="mydb",
    user="postgres",
    password="secret"
)

cursor = conn.cursor()
cursor.execute("SELECT * FROM products WHERE price > %s", (50,))
print(cursor.fetchall())  # 输出符合条件的产品列表
conn.close()

ORM工具[编辑 | 编辑源代码]

对象关系映射(ORM)工具如SQLAlchemy和Django ORM提供了更高层次的数据库操作方式:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
engine = create_engine('sqlite:///orm_example.db')

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

# 创建表
Base.metadata.create_all(engine)

# 插入数据
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
session.add(User(name="Bob", age=30))
session.commit()

连接池技术[编辑 | 编辑源代码]

对于高并发应用,连接池(如`DBUtils`)可显著提升性能:

from dbutils.pooled_db import PooledDB
import pymysql

pool = PooledDB(
    creator=pymysql,
    host='localhost',
    user='root',
    password='password',
    database='test_db',
    maxconnections=10
)

# 从池中获取连接
conn = pool.connection()
cursor = conn.cursor()
cursor.execute("SELECT * FROM large_table")
conn.close()  # 实际返回到连接池

事务管理[编辑 | 编辑源代码]

Python数据库连接支持ACID事务:

flowchart LR A[开始事务] --> B[执行操作1] B --> C[执行操作2] C --> D{成功?} D -->|是| E[提交事务] D -->|否| F[回滚事务]

try:
    conn = sqlite3.connect('bank.db')
    cursor = conn.cursor()
    cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id = 1")
    cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id = 2")
    conn.commit()  # 只有两个操作都成功时才提交
except Exception as e:
    conn.rollback()  # 任一失败则回滚
    print(f"事务失败: {e}")
finally:
    conn.close()

安全注意事项[编辑 | 编辑源代码]

1. 始终使用参数化查询防止SQL注入:

   # 错误方式(不安全)
   cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")

   # 正确方式
   cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))

2. 限制数据库用户权限 3. 加密敏感连接信息

性能优化[编辑 | 编辑源代码]

  • 使用连接池减少连接创建开销
  • 批量操作代替单条操作:
  # 低效方式
  for item in items:
      cursor.execute("INSERT INTO table VALUES (?)", (item,))

  # 高效方式
  cursor.executemany("INSERT INTO table VALUES (?)", [(item,) for item in items])
  • 为常用查询创建索引

实际应用案例[编辑 | 编辑源代码]

电商平台库存管理系统: 1. 使用PostgreSQL存储产品信息 2. 通过SQLAlchemy ORM管理产品分类 3. 采用连接池处理高并发订单 4. 事务确保库存扣减与订单创建的原子性

总结[编辑 | 编辑源代码]

Python数据库连接是Web开发的核心技能,从简单的SQLite嵌入式数据库到复杂的PostgreSQL集群,Python都提供了完善的接口支持。掌握连接管理、ORM工具和性能优化技术,能够构建高效可靠的数据驱动应用。