Psycopg2/PyMySQL:Python 连接关系型数据库

锵锵锵!老司机带你玩转Python数据库连接:Psycopg2 与 PyMySQL 的那些事儿

各位屏幕前的码农、攻城狮、程序猿们,晚上好!我是你们的老朋友,江湖人称“Bug终结者”的码农老王。今天,咱们不聊高深的算法,不谈复杂的架构,就来聊聊各位每天都要打交道,却又可能忽略掉的“老朋友”——数据库连接。

没错,就是连接数据库!别看它不起眼,要是连接出了问题,那可是牵一发动全身,整个系统都可能瘫痪。今天,我就带大家深入浅出地聊聊 Python 连接关系型数据库的两大利器:Psycopg2 和 PyMySQL。保证让你听得懂,学得会,用得上,还能在同事面前装个X!😉

开场白:数据库,程序猿的“后花园”

咱们的程序,就像一个精明的商人,需要不断地从数据库这个“后花园”里获取数据,才能完成各种操作,赚取“利润”。而连接数据库的工具,就好比是连接花园和商铺的“桥梁”,桥梁建得好不好,直接影响到“货物”的运输效率和安全性。

在Python的世界里,连接关系型数据库的选择很多,但 Psycopg2 和 PyMySQL 绝对是其中的佼佼者。一个专精于 PostgreSQL,一个擅长于 MySQL,它们就像是武林中的两大门派,各有千秋,各有所长。

第一章:Psycopg2:PostgreSQL 的“御用剑客”

咱们先来说说 Psycopg2。一听到这个名字,就感觉充满了力量,对不对?Psycopg2 是 Python 连接 PostgreSQL 数据库的“御用剑客”,它速度快、稳定、功能强大,是 PostgreSQL 数据库爱好者的首选。

1.1 安装 Psycopg2:磨刀不误砍柴工

要使用 Psycopg2,首先得把它安装好。安装方式很简单,只需要一行命令:

pip install psycopg2-binary

为什么要加一个 -binary 呢?因为直接安装 psycopg2 可能会遇到编译问题,而 psycopg2-binary 提供了预编译的二进制包,可以省去编译的麻烦,让你快速上手。🚀

1.2 连接 PostgreSQL:打开“后花园”的大门

安装好之后,就可以连接 PostgreSQL 数据库了。代码如下:

import psycopg2

# 数据库连接信息
db_host = "localhost"
db_name = "your_database_name"
db_user = "your_username"
db_password = "your_password"
db_port = "5432"  # PostgreSQL 默认端口

try:
    # 建立连接
    conn = psycopg2.connect(
        host=db_host,
        database=db_name,
        user=db_user,
        password=db_password,
        port=db_port
    )
    print("数据库连接成功!🎉")

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

    # 执行 SQL 语句
    cur.execute("SELECT version();")

    # 获取结果
    db_version = cur.fetchone()
    print(f"PostgreSQL 版本:{db_version[0]}")

    # 关闭游标和连接
    cur.close()
    conn.close()
    print("数据库连接已关闭。")

except psycopg2.Error as e:
    print(f"数据库连接失败:{e}")

这段代码做了什么呢?

  • 导入 psycopg2 模块: 就像武林高手要先拿出自己的剑一样。
  • 定义数据库连接信息: 告诉程序,“后花园”在哪里,钥匙是什么。
  • 建立连接: 打开“后花园”的大门。
  • 创建游标对象: 游标就像是你在“后花园”里的小助手,帮你执行各种操作。
  • 执行 SQL 语句: 让小助手去“后花园”里找东西。
  • 获取结果: 把找到的东西拿回来。
  • 关闭游标和连接: 完事之后,记得把“后花园”的大门关好,把小助手也带回来。

1.3 执行 SQL 语句:在“后花园”里寻宝

有了游标,就可以执行各种 SQL 语句了。比如:

  • 查询数据:
cur.execute("SELECT * FROM your_table_name;")
rows = cur.fetchall()
for row in rows:
    print(row)
  • 插入数据:
cur.execute("INSERT INTO your_table_name (column1, column2) VALUES (%s, %s);", ("value1", "value2"))
conn.commit() # 提交事务
  • 更新数据:
cur.execute("UPDATE your_table_name SET column1 = %s WHERE id = %s;", ("new_value", 1))
conn.commit() # 提交事务
  • 删除数据:
cur.execute("DELETE FROM your_table_name WHERE id = %s;", (1,))
conn.commit() # 提交事务

注意: 每次执行完 INSERTUPDATEDELETE 语句后,都需要调用 conn.commit() 提交事务,才能将修改保存到数据库中。就像你把“后花园”里的东西搬走了,得告诉管理员一声,让他记录下来。

1.4 参数化查询:防止 SQL 注入的“金钟罩”

SQL 注入是一种常见的安全漏洞,攻击者可以通过构造恶意的 SQL 语句,来获取数据库中的敏感信息。为了防止 SQL 注入,我们应该使用参数化查询。

参数化查询,就像给 SQL 语句穿上了一件“金钟罩”,可以有效地防止 SQL 注入。

# 不安全的写法:
# user_input = "'; DROP TABLE users; --"
# cur.execute("SELECT * FROM users WHERE username = '" + user_input + "';")

# 安全的写法:
user_input = "'; DROP TABLE users; --"
cur.execute("SELECT * FROM users WHERE username = %s;", (user_input,))

在参数化查询中,我们使用 %s 作为占位符,然后将参数以元组的形式传递给 execute() 方法。Psycopg2 会自动对参数进行转义,防止 SQL 注入。

1.5 使用 with 语句:优雅地管理连接

为了确保数据库连接在使用完毕后能够正确关闭,我们可以使用 with 语句。

import psycopg2

db_host = "localhost"
db_name = "your_database_name"
db_user = "your_username"
db_password = "your_password"
db_port = "5432"

try:
    with psycopg2.connect(
        host=db_host,
        database=db_name,
        user=db_user,
        password=db_password,
        port=db_port
    ) as conn:
        with conn.cursor() as cur:
            cur.execute("SELECT version();")
            db_version = cur.fetchone()
            print(f"PostgreSQL 版本:{db_version[0]}")

            # 其他 SQL 操作...

    print("数据库连接已关闭。")

except psycopg2.Error as e:
    print(f"数据库连接失败:{e}")

使用 with 语句,可以自动管理连接和游标的生命周期,确保它们在使用完毕后能够正确关闭,避免资源泄漏。就像你使用完“后花园”后,会自动把门关好,把小助手也送回去。

第二章:PyMySQL:MySQL 的“贴身护卫”

说完了 PostgreSQL 的“御用剑客” Psycopg2,咱们再来看看 MySQL 的“贴身护卫” PyMySQL。PyMySQL 是一个纯 Python 实现的 MySQL 客户端库,它可以让你在 Python 中轻松地连接和操作 MySQL 数据库。

2.1 安装 PyMySQL:准备“护卫”的装备

安装 PyMySQL 也很简单,只需要一行命令:

pip install pymysql

2.2 连接 MySQL:进入 MySQL 的“练功房”

安装好 PyMySQL 后,就可以连接 MySQL 数据库了。代码如下:

import pymysql

# 数据库连接信息
db_host = "localhost"
db_name = "your_database_name"
db_user = "your_username"
db_password = "your_password"
db_port = 3306  # MySQL 默认端口

try:
    # 建立连接
    conn = pymysql.connect(
        host=db_host,
        database=db_name,
        user=db_user,
        password=db_password,
        port=db_port,
        charset='utf8mb4', # 设置字符集
        cursorclass=pymysql.cursors.DictCursor # 设置游标类型
    )
    print("数据库连接成功!💪")

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

    # 执行 SQL 语句
    cur.execute("SELECT VERSION()")

    # 获取结果
    db_version = cur.fetchone()
    print(f"MySQL 版本:{db_version['VERSION()']}")

    # 关闭游标和连接
    cur.close()
    conn.close()
    print("数据库连接已关闭。")

except pymysql.MySQLError as e:
    print(f"数据库连接失败:{e}")

这段代码和连接 PostgreSQL 的代码非常相似,只是在连接参数上有一些区别:

  • charset: 设置字符集,建议使用 utf8mb4,可以支持更多的字符,包括 emoji 表情。😎
  • cursorclass: 设置游标类型,pymysql.cursors.DictCursor 可以让查询结果以字典的形式返回,方便操作。

2.3 执行 SQL 语句:在“练功房”里修炼

有了游标,就可以执行各种 SQL 语句了。和 Psycopg2 类似,PyMySQL 也支持查询、插入、更新、删除等操作。

# 查询数据:
cur.execute("SELECT * FROM your_table_name")
rows = cur.fetchall()
for row in rows:
    print(row)

# 插入数据:
cur.execute("INSERT INTO your_table_name (column1, column2) VALUES (%s, %s)", ("value1", "value2"))
conn.commit()

# 更新数据:
cur.execute("UPDATE your_table_name SET column1 = %s WHERE id = %s", ("new_value", 1))
conn.commit()

# 删除数据:
cur.execute("DELETE FROM your_table_name WHERE id = %s", (1,))
conn.commit()

2.4 参数化查询:保护“练功房”的安全

和 Psycopg2 一样,PyMySQL 也支持参数化查询,可以有效地防止 SQL 注入。

# 不安全的写法:
# user_input = "'; DROP TABLE users; --"
# cur.execute("SELECT * FROM users WHERE username = '" + user_input + "'")

# 安全的写法:
user_input = "'; DROP TABLE users; --"
cur.execute("SELECT * FROM users WHERE username = %s", (user_input,))

2.5 使用 with 语句:优雅地离开“练功房”

同样,为了确保数据库连接在使用完毕后能够正确关闭,我们可以使用 with 语句。

import pymysql

db_host = "localhost"
db_name = "your_database_name"
db_user = "your_username"
db_password = "your_password"
db_port = 3306

try:
    with pymysql.connect(
        host=db_host,
        database=db_name,
        user=db_user,
        password=db_password,
        port=db_port,
        charset='utf8mb4',
        cursorclass=pymysql.cursors.DictCursor
    ) as conn:
        with conn.cursor() as cur:
            cur.execute("SELECT VERSION()")
            db_version = cur.fetchone()
            print(f"MySQL 版本:{db_version['VERSION()']}")

            # 其他 SQL 操作...

    print("数据库连接已关闭。")

except pymysql.MySQLError as e:
    print(f"数据库连接失败:{e}")

第三章:Psycopg2 vs PyMySQL:谁更胜一筹?

Psycopg2 和 PyMySQL 都是优秀的 Python 数据库连接库,它们各有优缺点,适用于不同的场景。

特性 Psycopg2 PyMySQL
数据库支持 PostgreSQL MySQL
性能 性能更高,更接近 C 语言的性能 纯 Python 实现,性能相对较低
安全性 对 SQL 注入的防护更强 需要注意参数化查询,防止 SQL 注入
安装 可能需要编译,安装相对复杂 纯 Python 实现,安装简单
功能 功能强大,支持 PostgreSQL 的高级特性 功能相对简单,满足 MySQL 的基本需求
社区 社区活跃,文档完善 社区活跃,文档完善
使用场景 需要高性能、安全性要求高的 PostgreSQL 应用 需要快速开发、对性能要求不高的 MySQL 应用

总结:

  • 如果你的项目使用 PostgreSQL 数据库,并且对性能和安全性要求很高,那么 Psycopg2 是你的首选。
  • 如果你的项目使用 MySQL 数据库,并且需要快速开发,对性能要求不高,那么 PyMySQL 是一个不错的选择。

结语:选择适合自己的“武器”

无论是 Psycopg2 还是 PyMySQL,它们都是我们连接数据库的“武器”。选择哪一种“武器”,取决于你的具体需求和项目场景。

希望今天的分享能帮助大家更好地理解和使用 Psycopg2 和 PyMySQL,在数据库的世界里,自由驰骋!💪

最后,别忘了点赞、评论、转发,让更多的小伙伴一起学习!我们下期再见!👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注