SQL语言如何在Python中执行查询 SQL语言与Python连接数据库的完整教程

在python中执行sql查询,需先选择合适的数据库连接库,1. 对于sqlite使用内置sqlite3库,2. 对于postgresql安装psycopg2,3. 对于mysql使用pymysql或mysql-connector-python;通过connect()建立连接,使用cursor()创建游标执行sql语句,执行增删改操作后必须调用commit()提交更改,查询时使用fetchall()获取结果,最后关闭连接;为防止sql注入应使用参数化查询,如用?占位符传递参数;为提升性能在高并发场景下应使用数据库连接池,如通过sqlalchemy的create_engine配置pool_size和max_overflow管理连接;错误处理需使用try...except捕获相应异常如sqlite3.error,确保程序健壮性,所有操作完成后必须正确关闭连接或会话以释放资源。

在Python中执行SQL查询,简单来说,就是利用Python的数据库连接库(如

sqlite3
,
psycopg2
,
pymysql
等)建立与数据库的连接,然后通过游标对象执行SQL语句。

解决方案

首先,你需要选择一个适合你的数据库和Python的数据库连接库。例如,如果你的数据库是SQLite,Python内置了

sqlite3
库,无需额外安装。如果是PostgreSQL,则需要安装
psycopg2
。MySQL则需要
pymysql
mysql-connector-python

以SQLite为例:

import sqlite3

# 连接到数据库 (如果数据库不存在,则会创建一个)
conn = sqlite3.connect('my_database.db')

# 创建一个游标对象
cursor = conn.cursor()

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

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

# 提交更改
conn.commit()

# 执行查询
cursor.execute("SELECT * FROM users")

# 获取查询结果
results = cursor.fetchall()

# 打印结果
for row in results:
    pr

int(row) # 关闭连接 conn.close()

这段代码展示了如何连接到SQLite数据库,创建表,插入数据,执行查询并获取结果。重要的是

conn.commit()
,它用于保存更改。忘记提交,你的插入操作就白费了。

使用参数化查询

为了防止SQL注入攻击,务必使用参数化查询:

name = 'Charlie'
age = 35
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", (name, age))
conn.commit()

?
是占位符,Python数据库连接库会自动转义参数,防止恶意代码注入。

如何选择合适的Python数据库连接库?

选择取决于你的数据库类型。

sqlite3
适合小型项目和学习,因为它无需安装额外的数据库服务器。
psycopg2
是PostgreSQL的推荐选择,性能好,功能强大。
pymysql
mysql-connector-python
用于连接MySQL,后者是MySQL官方提供的。

数据库连接池是什么?为什么需要它?

数据库连接池维护一组数据库连接,以便重复使用。每次执行查询都创建和关闭连接会消耗大量资源。连接池可以显著提高性能,尤其是在高并发环境下。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 创建一个数据库引擎 (以PostgreSQL为例)
engine = create_engine('postgresql://user:password@host:port/database', pool_size=5, max_overflow=10)

# 创建一个会话类
Session = sessionmaker(bind=engine)

# 使用会话
session = Session()
try:
    # 执行查询
    results = session.execute("SELECT * FROM users")
    for row in results:
        print(row)
except Exception as e:
    print(f"Error: {e}")
finally:
    session.close() # 归还连接到连接池

sqlalchemy
是一个强大的ORM(对象关系映射)库,它提供了连接池功能,并简化了数据库操作。
pool_size
设置初始连接数,
max_overflow
设置最大连接数。用完连接后,必须关闭会话,将连接返回到连接池。

如何处理SQL查询中的错误?

错误处理至关重要。使用

try...except
块捕获异常:

try:
    cursor.execute("SELECT * FROM non_existent_table")
except sqlite3.Error as e:
    print(f"An error occurred: {e}")

sqlite3.Error
是SQLite特定的异常。对于其他数据库,你需要捕获相应的异常类型。良好的错误处理可以帮助你快速定位问题并改进代码。