【Python百宝箱】Python数据库驾驶舱:掌握不同库和框架,畅游数据库操作的海洋

数据库连接艺术:Python中连接、操作、事务管理的精髓

前言

在现代软件开发中,与数据库的交互是不可或缺的一环。Python作为一门强大的编程语言,拥有多种数据库连接库和ORM框架,为开发者提供了灵活、高效的数据库操作方式。本文将深入探讨Python中常用的数据库连接库,包括psycopg2、MySQL Connector、pyodbc等,并引入ORM框架如SQLAlchemy和peewee。通过详细的大纲和实例代码,读者将全面了解这些库的基本使用方法、事务管理、错误处理等核心概念。

【Python百宝箱】数据舞台:Python数据库实战手册

欢迎订阅专栏:Python库百宝箱:解锁编程的神奇世界

文章目录

1. psycopg2

1.1 安装与配置

Psycopg2是Python连接PostgreSQL数据库的库。通过以下步骤安装:

pip install psycopg2

在使用之前,确保PostgreSQL数据库已安装并设置好,然后配置连接参数。

1.2 基本连接

使用psycopg2建立到PostgreSQL数据库的基本连接:

import psycopg2

# 连接参数
conn_params = {
    
    
    'host': 'your_host', 
    'database': 'your_database',
    'user': 'your_user',
    'password': 'your_password'
}

# 连接数据库
conn = psycopg2.connect(**conn_params)

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

# 关闭连接
conn.close()
1.3 执行SQL查询

执行简单的SQL查询:

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

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

# 打印结果
for row in result:
    print(row)
1.4 事务管理

使用psycopg2进行事务管理:

# 开始事务
conn = psycopg2.connect(**conn_params)
cursor = conn.cursor()

try:
    # 执行SQL语句
    cursor.execute("INSERT INTO your_table (column1, column2) VALUES (%s, %s)", (value1, value2))

    # 提交事务
    conn.commit()
except Exception as e:
    # 发生错误时回滚
    conn.rollback()
    print(f"Error: {
      
      e}")
finally:
    # 关闭连接
    conn.close()
1.5 错误处理

捕获并处理psycopg2的错误:

try:
    # 尝试连接
    conn = psycopg2.connect(**conn_params)
except psycopg2.Error as e:
    print(f"Unable to connect to the database. Error: {
      
      e}")
1.6 数据类型映射

在使用Psycopg2时,了解数据库数据类型与Python数据类型之间的映射关系非常重要。Psycopg2会尽力将数据库中的数据类型映射为相应的Python数据类型,以便更方便地处理数据。以下是一个简单的例子:

import psycopg2
from psycopg2 import sql

# 连接参数
conn_params = {
    
    
    'host': 'your_host',
    'database': 'your_database',
    'user': 'your_user',
    'password': 'your_password'
}

# 连接数据库
conn = psycopg2.connect(**conn_params)
cursor = conn.cursor()

# 创建一个包含不同数据类型的表
create_table_query = """
    CREATE TABLE data_types_table (
        id SERIAL PRIMARY KEY,
        text_column TEXT,
        integer_column INTEGER,
        float_column FLOAT,
        boolean_column BOOLEAN
    )
"""
cursor.execute(create_table_query)
conn.commit()

# 插入一行数据
insert_data_query = """
    INSERT INTO data_types_table (text_column, integer_column, float_column, boolean_column)
    VALUES (%s, %s, %s, %s)
"""
data = ('Sample Text', 42, 3.14, True)
cursor.execute(insert_data_query, data)
conn.commit()

# 查询数据
select_query = "SELECT * FROM data_types_table"
cursor.execute(select_query)
result = cursor.fetchall()

# 打印结果
for row in result:
    print(row)

# 关闭连接
conn.close()
1.7 使用连接池

在实际应用中,频繁地打开和关闭数据库连接可能会影响性能。Psycopg2提供了连接池的支持,通过连接池可以更有效地管理数据库连接。以下是一个简单的使用连接池的例子:

from psycopg2 import pool

# 连接池参数
pool_params = {
    
    
    'minconn': 1,
    'maxconn': 10,
    'host': 'your_host',
    'database': 'your_database',
    'user': 'your_user',
    'password': 'your_password'
}

# 创建连接池
conn_pool = pool.SimpleConnectionPool(**pool_params)

# 从连接池获取连接
conn = conn_pool.getconn()

# 使用连接执行查询
cursor = conn.cursor()
cursor.execute("SELECT * FROM your_table")
result = cursor.fetchall()
for row in result:
    print(row)

# 将连接放回连接池
conn_pool.putconn(conn)
1.8 使用 Psycopg2-Extras 扩展

Psycopg2-Extras 是 Psycopg2 的一个附加模块,提供了额外的功能和工具,方便进行更高级的数据库操作。例如,Psycopg2-Extras 中的 execute_values 函数允许高效地插入多行数据:

from psycopg2.extras import execute_values

# 连接数据库
conn = psycopg2.connect(**conn_params)
cursor = conn.cursor()

# 插入多行数据
data_to_insert = [(1, 'John'), (2, 'Alice'), (3, 'Bob')]
insert_query = "INSERT INTO your_table (id, name) VALUES %s"
execute_values(cursor, insert_query, data_to_insert)
conn.commit()

# 查询数据
cursor.execute("SELECT * FROM your_table")
result = cursor.fetchall()

# 打印结果
for row in result:
    print(row)

# 关闭连接
conn.close()

通过 Psycopg2-Extras,你可以更加便捷地执行各种数据库操作,提高代码的可读性和效率。

1.9 逐批次处理大量数据

在处理大量数据时,为了避免内存占用过高,可以采用逐批次处理的方式。Psycopg2 提供了 fetchmany 方法,可以指定每次获取的行数。以下是一个简单的例子:

# 连接数据库
conn = psycopg2.connect(**conn_params)
cursor = conn.cursor()

# 查询数据
cursor.execute("SELECT * FROM your_large_table")

# 指定每次获取的行数
batch_size = 100
while True:
    batch = cursor.fetchmany(batch_size)
    if not batch:
        break

    # 处理当前批次的数据
    for row in batch:
        process_row(row)

# 关闭连接
conn.close()

通过逐批次处理,可以有效地处理大规模数据集而不会占用过多内存。

1.10 使用 Psycopg2-Binary 插入二进制数据

有时候需要在数据库中存储二进制数据,比如图片、音频文件等。Psycopg2 提供了 Psycopg2-Binary 模块,可以方便地插入和检索二进制数据:

from psycopg2 import Binary

# 连接数据库
conn = psycopg2.connect(**conn_params)
cursor = conn.cursor()

# 读取二进制文件
with open('path/to/your/file.jpg', 'rb') as file:
    binary_data = file.read()

# 插入二进制数据
insert_query = "INSERT INTO your_binary_table (binary_data) VALUES (%s)"
cursor.execute(insert_query, (Binary(binary_data),))
conn.commit()

# 查询二进制数据
cursor.execute("SELECT binary_data FROM your_binary_table")
result = cursor.fetchone()

# 将二进制数据写入文件
with open('path/to/save/file.jpg', 'wb') as file:
    file.write(result[0])

# 关闭连接
conn.close()

通过 Psycopg2-Binary 模块,可以轻松地在数据库中存储和检索二进制数据。

2. MySQL Connector

2.1 安装与配置

MySQL Connector是Python连接MySQL数据库的库。通过以下步骤安装:

pip install mysql-connector-python

在使用之前,确保MySQL数据库已安装并设置好,然后配置连接参数。

2.2 基本连接

使用MySQL Connector建立到MySQL数据库的基本连接:

import mysql.connector

# 连接参数
conn_params = {
    
    
    'host': 'your_host',
    'database': 'your_database',
    'user': 'your_user',
    'password': 'your_password'
}

# 连接数据库
conn = mysql.connector.connect(**conn_params)

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

# 关闭连接
conn.close()
2.3 执行SQL查询

执行简单的SQL查询:

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

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

# 打印结果
for row in result:
    print(row)
2.4 事务管理

使用MySQL Connector进行事务管理:

# 开始事务
conn = mysql.connector.connect(**conn_params)
cursor = conn.cursor()

try:
    # 执行SQL语句
    cursor.execute("INSERT INTO your_table (column1, column2) VALUES (%s, %s)", (value1, value2))

    # 提交事务
    conn.commit()
except mysql.connector.Error as e:
    # 发生错误时回滚
    conn.rollback()
    print(f"Error: {
      
      e}")
finally:
    # 关闭连接
    conn.close()
2.5 错误处理

捕获并处理MySQL Connector的错误:

try:
    # 尝试连接
    conn = mysql.connector.connect(**conn_params)
except mysql.connector.Error as e:
    print(f"Unable to connect to the database. Error: {
      
      e}")
2.6 数据库连接池

MySQL Connector提供了连接池的支持,通过连接池可以更有效地管理数据库连接。以下是一个简单的使用连接池的例子:

from mysql.connector import pooling

# 连接池参数
pool_params = {
    
    
    'pool_name': 'your_pool',
    'pool_size': 5,
    'host': 'your_host',
    'database': 'your_database',
    'user': 'your_user',
    'password': 'your_password'
}

# 创建连接池
conn_pool = pooling.MySQLConnectionPool(**pool_params)

# 从连接池获取连接
conn = conn_pool.get_connection()

# 使用连接执行查询
cursor = conn.cursor()
cursor.execute("SELECT * FROM your_table")
result = cursor.fetchall()
for row in result:
    print(row)

# 将连接放回连接池
conn_pool.release_connection(conn)

通过连接池,可以有效地重用连接,降低连接的创建和销毁开销,提高性能。

2.7 使用MySQL Connector-Context Manager

MySQL Connector支持使用上下文管理器,使得在处理异常和自动提交方面更为方便:

from mysql.connector import connect

# 连接参数
conn_params = {
    
    
    'host': 'your_host',
    'database': 'your_database',
    'user': 'your_user',
    'password': 'your_password'
}

# 使用上下文管理器连接数据库
with connect(**conn_params) as conn:
    # 创建游标
    with conn.cursor() as cursor:
        # 执行查询
        cursor.execute("SELECT * FROM your_table")
        result = cursor.fetchall()

        # 打印结果
        for row in result:
            print(row)

# 这里不需要手动关闭连接,上下文管理器会自动处理

通过使用上下文管理器,可以确保在代码块结束时自动关闭连接,避免忘记手动关闭的问题。

2.8 MySQL Connector与ORM框架整合

MySQL Connector可以与多个ORM框架无缝整合,其中包括SQLAlchemy和Django ORM。以下是一个与SQLAlchemy整合的简单示例:

from sqlalchemy import create_engine, Column, Integer, String, MetaData, Table
from sqlalchemy.orm import declarative_base, Session

# MySQL Connector连接字符串
mysql_conn_str = 'mysql+mysqlconnector://your_user:your_password@your_host/your_database'

# 创建引擎和会话
engine = create_engine(mysql_conn_str)
Base = declarative_base(bind=engine)
session = Session(bind=engine)

# 定义模型
class YourModel(Base):
    __tablename__ = 'your_table'
    id = Column(Integer, primary_key=True)
    name = Column(String(255))

# 查询数据
data = session.query(YourModel).all()

# 打印结果
for row in data:
    print(row.name)

通过整合ORM框架,可以使用面向对象的方式操作数据库,提高代码的可读性和可维护性。

2.9 使用MySQL Connector-X DevAPI

MySQL Connector-X DevAPI是MySQL官方提供的一种新的API,支持更现代的异步、面向文档的数据库访问。以下是一个简单的示例:

from  mysqlsh import mysqlx

# 连接数据库
session = mysqlx.get_session({
    
    
    'host': 'your_host',
    'port': 33060,
    'user': 'your_user',
    'password': 'your_password'
})

# 获取schema
schema = session.get_schema('your_database')

# 查询数据
result = schema.get_collection('your_table').find().execute()

# 打印结果
for row in result.fetch_all():
    print(row)

MySQL Connector-X DevAPI提供了更为现代和灵活的方式来与MySQL进行交互,特别适合异步和面向文档的应用场景。

2.10 MySQL Connector-Python 的 SSL 连接

在与MySQL数据库建立连接时,有时需要使用SSL进行加密通信。MySQL Connector-Python提供了对SSL连接的支持:

import mysql.connector

# SSL配置
ssl_config = {
    
    
    'ssl_ca': 'path/to/ca.crt',
    'ssl_cert': 'path/to/client-cert.crt',
    'ssl_key': 'path/to/client-key.key',
}

# 连接参数
conn_params = {
    
    
    'host': 'your_host',
    'database': 'your_database',
    'user': 'your_user',
    'password': 'your_password',
    'ssl': ssl_config
}

# 连接数据库
conn = mysql.connector.connect(**conn_params)

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

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

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

# 打印结果
for row in result:
    print(row)

# 关闭连接
conn.close()

通过SSL连接,可以确保数据库通信的安全性。注意,需要提供相应的证书和密钥文件路径。

2.11 MySQL Connector-Python 中的连接池动态调整

对于MySQL Connector-Python,我们可以利用pool_size参数动态调整连接池的大小,以适应应用程序负载的变化。以下是一个简单的例子:

import mysql.connector.pooling 

# 连接池参数
pool_params = {
    
    
    'pool_name': 'your_pool',
    'pool_size': 5,
    'host': 'your_host',
    'database': 'your_database',
    'user': 'your_user',
    'password': 'your_password'
}

# 创建连接池
conn_pool = mysql.connector.pooling.MySQLConnectionPool(**pool_params)

# 获取连接
conn = conn_pool.get_connection()

# 使用连接执行查询
cursor = conn.cursor()
cursor.execute("SELECT * FROM your_table")
result = cursor.fetchall()
for row in result:
    print(row)

# 将连接放回连接池
conn_pool.release_connection(conn)

通过动态调整连接池大小,可以更好地应对不同负载下的数据库连接需求。

3. pyodbc

3.1 安装与配置

pyodbc是Python连接ODBC兼容数据库的库。通过以下步骤安装:

pip install pyodbc

在使用之前,确保ODBC驱动已安装并设置好,然后配置ODBC连接参数。

3.2 基本连接

使用pyodbc建立到ODBC兼容数据库的基本连接:

import pyodbc

# 连接字符串
conn_str = 'DRIVER={ODBC Driver};SERVER=your_server;DATABASE=your_database;UID=your_user;PWD=your_password'

# 连接数据库
conn = pyodbc.connect(conn_str)

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

# 关闭连接
conn.close()
3.3 执行SQL查询

执行简单的SQL查询:

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

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

# 打印结果
for row in result:
    print(row)
3.4 事务管理

使用pyodbc进行事务管理:

# 开始事务
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

try:
    # 执行SQL语句
    cursor.execute("INSERT INTO your_table (column1, column2) VALUES (?, ?)", (value1, value2))

    # 提交事务
    conn.commit()
except pyodbc.Error as e:
    # 发生错误时回滚
    conn.rollback()
    print(f"Error: {
      
      e}")
finally:
    # 关闭连接
    conn.close()
3.5 错误处理

捕获并处理pyodbc的错误:

try:
    # 尝试连接
    conn = pyodbc.connect(conn_str)
except pyodbc.Error as e:
    print(f"Unable to connect to the database. Error: {
      
      e}")
3.6 数据类型映射

在使用pyodbc时,了解数据库数据类型与Python数据类型之间的映射关系非常重要。pyodbc会尽力将数据库中的数据类型映射为相应的Python数据类型,以便更方便地处理数据。以下是一个简单的例子:

import pyodbc

# 连接字符串
conn_str = 'DRIVER={ODBC Driver};SERVER=your_server;DATABASE=your_database;UID=your_user;PWD=your_password'

# 连接数据库
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()

# 创建一个包含不同数据类型的表
create_table_query = """
    CREATE TABLE data_types_table (
        id INT IDENTITY(1,1) PRIMARY KEY,
        text_column NVARCHAR(255),
        integer_column INT,
        float_column FLOAT,
        boolean_column BIT
    )
"""
cursor.execute(create_table_query)
conn.commit()

# 插入一行数据
insert_data_query = """
    INSERT INTO data_types_table (text_column, integer_column, float_column, boolean_column)
    VALUES (?, ?, ?, ?)
"""
data = ('Sample Text', 42, 3.14, True)
cursor.execute(insert_data_query, data)
conn.commit()

# 查询数据
select_query = "SELECT * FROM data_types_table"
cursor.execute(select_query)
result = cursor.fetchall()

# 打印结果
for row in result:
    print(row)

# 关闭连接
conn.close()
3.7 使用连接池

在实际应用中,频繁地打开和关闭数据库连接可能会影响性能。pyodbc提供了连接池的支持,通过连接池可以更有效地管理数据库连接。以下是一个简单的使用连接池的例子:

import pyodbc.pooling

# 连接池参数
pool_params = {
    
    
    'minconn': 1,
    'maxconn': 10,
    'DRIVER': '{ODBC Driver}',
    'SERVER': 'your_server',
    'DATABASE': 'your_database',
    'UID': 'your_user',
    'PWD': 'your_password'
}

# 创建连接池
conn_pool = pyodbc.pooling.ConnectionPool(**pool_params)

# 从连接池获取连接
conn = conn_pool.getconn()

# 使用连接执行查询
cursor = conn.cursor()
cursor.execute("SELECT * FROM your_table")
result = cursor.fetchall()
for row in result:
    print(row)

# 将连接放回连接池
conn_pool.putconn(conn)

通过连接池,可以更有效地管理和重用连接,提高性能。

3.8 使用 pyodbc 配置文件

为了避免在代码中硬编码连接字符串,pyodbc支持使用配置文件。以下是一个简单的例子:

# database.ini

[database]
DRIVER={ODBC Driver}
SERVER=your_server
DATABASE=your_database
UID=your_user
PWD=your_password

然后在代码中使用配置文件:

import pyodbc

# 读取配置文件
config_file = 'path/to/database.ini'
conn_str = ';'.join([f"{
      
      key}={
      
      value}" for key, value in pyodbc.connect(readOnly=True, cfgFile=config_file).get_conn_info().items()])

# 连接数据库
conn = pyodbc.connect(conn_str)

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

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

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

# 打印结果
for row in result:
    print(row)

# 关闭连接
conn.close()

通过使用配置文件,可以更方便地管理连接字符串,便于维护和修改。

3.9 使用 pyodbc 进行批量插入

pyodbc提供了executemany方法,可以高效地执行批量插入操作。以下是一个简单的例子:

import pyodbc

# 连接字符串
conn_str = 'DRIVER={ODBC Driver};SERVER=your_server;DATABASE=your_database;UID=your_user;PWD=your_password'

# 连接数据库
conn = pyodbc.connect(conn_str)

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

# 插入多行数据
data_to_insert = [(1, 'John'), (2, 'Alice'), (3, 'Bob')]
insert_query = "INSERT INTO your_table (id, name) VALUES (?, ?)"
cursor.executemany(insert_query, data_to_insert)
conn.commit()

# 查询数据
cursor.execute("SELECT * FROM your_table")
result = cursor.fetchall()

# 打印结果
for row in result:
    print(row)

# 关闭连接
conn.close()

通过executemany方法,可以避免多次执行相同的插入语句,提高插入性能。

3.10 使用 pyodbc 进行存储过程调用

pyodbc支持调用数据库中的存储过程。以下是一个简单的例子:

import pyodbc

# 连接字符串
conn_str = 'DRIVER={ODBC Driver};SERVER=your_server;DATABASE=your_database;UID=your_user;PWD=your_password'

# 连接数据库
conn = pyodbc.connect(conn_str)

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

# 执行存储过程
stored_proc_name = 'your_stored_procedure'
input_param = 'your_input_value'
output_param = cursor.var(pyodbc.SQL_VARCHAR)
cursor.execute(f"EXEC {
      
      stored_proc_name} @input_param=?, @output_param OUTPUT", input_param, output_param)

# 获取存储过程输出参数值
output_value = output_param.value

# 打印结果
print(f"Output value: {
      
      output_value}")

# 关闭连接
conn.close()

通过EXEC语句,可以调用数据库中的存储过程,并获取输出参数的值。

4. SQLAlchemy

4.1 安装与配置

SQLAlchemy是Python的SQL工具和对象关系映射(ORM)库。通过以下步骤安装:

pip install sqlalchemy
4.2 数据库连接
4.2.1 使用Engine连接

使用SQLAlchemy的Engine进行数据库连接:

from sqlalchemy import create_engine

# 数据库连接字符串
db_url = "postgresql://your_user:your_password@your_host:your_port/your_database"

# 创建Engine
engine = create_engine(db_url)

# 获取连接
conn = engine.connect()

# 执行SQL查询
result = conn.execute("SELECT * FROM your_table").fetchall()

# 打印结果
for row in result:
    print(row)

# 关闭连接
conn.close()
4.2.2 连接池管理

使用SQLAlchemy的连接池进行数据库连接管理:

from sqlalchemy import create_engine, pool

# 创建带连接池的Engine
engine = create_engine(db_url, poolclass=pool.QueuePool, pool_size=5, max_overflow=10)

# 获取连接
conn = engine.connect()

# 执行SQL查询
result = conn.execute("SELECT * FROM your_table").fetchall()

# 打印结果
for row in result:
    print(row)

# 关闭连接
conn.close()
4.2.3 多数据库连接

使用SQLAlchemy连接多个数据库:

from sqlalchemy import create_engine

# 第一个数据库连接
db_url1 = "postgresql://user1:password1@host1:port1/database1"
engine1 = create_engine(db_url1)

# 第二个数据库连接
db_url2 = "postgresql://user2:password2@host2:port2/database2"
engine2 = create_engine(db_url2)

# 获取连接
conn1 = engine1.connect()
conn2 = engine2.connect()

# 执行SQL查询
result1 = conn1.execute("SELECT * FROM table1").fetchall()
result2 = conn2.execute("SELECT * FROM table2").fetchall()

# 打印结果
for row in result1:
    print(row)

for row in result2:
    print(row)

# 关闭连接
conn1.close()
conn2.close()
4.3 ORM概述

SQLAlchemy的ORM允许使用Python类来表示数据库表:

from sqlalchemy import create_engine, Column, Integer, String, MetaData, Table

# 定义元数据
metadata = MetaData()

# 定义表格
users_table = Table('users', metadata,
                    Column('id', Integer, primary_key=True),
                    Column('name', String),
                    Column('age', Integer)
                    )

# 创建Engine
engine = create_engine(db_url)

# 创建表格
metadata.create_all(engine)
4.4 定义模型

使用ORM定义模型:

from sqlalchemy import create_engine, Column, Integer, String, Sequence, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

# 创建Base
Base = declarative_base()

# 定义User模型
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    age = Column(Integer)

# 创建Engine
engine = create_engine(db_url)

# 创建表格
Base.metadata.create_all(engine)
4.5 查询与过滤

使用SQLAlchemy进行查询和过滤:

from sqlalchemy import create_engine, select

# 创建Engine
engine = create_engine(db_url)

# 获取连接
conn = engine.connect()

# 创建查询
query = select([User]).where(User.age > 25)

# 执行查询
result = conn.execute(query).fetchall()

# 打印结果
for row in result:
    print(row)

# 关闭连接
conn.close()
4.6 插入与更新

使用SQLAlchemy进行数据插入和更新操作:

from sqlalchemy import create_engine, insert, update

# 创建Engine
engine = create_engine(db_url)

# 获取连接
conn = engine.connect()

# 插入数据
insert_query = insert(User).values(name='John', age=30)
conn.execute(insert_query)

# 查询并打印结果
select_query = select([User])
result = conn.execute(select_query).fetchall()
for row in result:
    print(row)

# 更新数据
update_query = update(User).where(User.name == 'John').values(age=31)
conn.execute(update_query)

# 查询并打印更新后的结果
result = conn.execute(select_query).fetchall()
for row in result:
    print(row)

# 关闭连接
conn.close()
4.7 删除

使用SQLAlchemy进行数据删除操作:

from sqlalchemy import create_engine, delete

# 创建Engine
engine = create_engine(db_url)

# 获取连接
conn = engine.connect()

# 删除数据
delete_query = delete(User).where(User.name == 'John')
conn.execute(delete_query)

# 查询并打印删除后的结果
select_query = select([User])
result = conn.execute(select_query).fetchall()
for row in result:
    print(row)

# 关闭连接
conn.close()
4.8 事务管理

使用SQLAlchemy进行事务管理:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 创建Engine
engine = create_engine(db_url)

# 创建Session
Session = sessionmaker(bind=engine)
session = Session()

# 开始事务
trans = session.begin()

try:
    # 插入数据
    user = User(name='Alice', age=28)
    session.add(user)

    # 提交事务
    session.commit()

except Exception as e:
    # 回滚事务
    trans.rollback()
    print(f"Error: {
      
      e}")

finally:
    # 关闭Session
    session.close()
4.9 使用ORM关系

使用SQLAlchemy进行ORM关系建模:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, backref, Session

# 创建Engine
engine = create_engine(db_url)

# 创建Base
Base = declarative_base()

# 定义Department模型
class Department(Base):
    __tablename__ = 'departments'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    employees = relationship('Employee', backref='department', lazy='dynamic')

# 定义Employee模型
class Employee(Base):
    __tablename__ = 'employees'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    department_id = Column(Integer, ForeignKey('departments.id'))

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

# 创建Session
Session = sessionmaker(bind=engine)
session = Session()

# 创建部门和员工
department = Department(name='IT')
employee1 = Employee(name='John', department=department)
employee2 = Employee(name='Alice', department=department)

# 添加到Session并提交
session.add_all([department, employee1, employee2])
session.commit()

# 查询部门和员工
it_department = session.query(Department).filter_by(name='IT').first()
print(f"Department: {
      
      it_department.name}")

employees = it_department.employees.all()
print("Employees:")
for employee in employees:
    print(f"- {
      
      employee.name}")

# 关闭Session
session.close()
4.10 使用SQLAlchemy连接非关系型数据库

SQLAlchemy也支持连接非关系型数据库,如MongoDB。以下是一个简单的例子:

from sqlalchemy import create_engine, Column, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# MongoDB连接字符串
mongo_db_url = 'mongodb+srv://your_user:[email protected]/your_database'

# 创建Engine
engine = create_engine(mongo_db_url)

# 创建Base
Base = declarative_base()

# 定义模型
class Person(Base):
    __tablename__ = 'people'
    name = Column(String, primary_key=True)
    age = Column(String)

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

# 创建Session
Session = sessionmaker(bind=engine)
session = Session()

# 插入数据
person = Person(name='John', age='30')
session.add(person)
session.commit()

# 查询数据
result = session.query(Person).filter_by(name='John').first()
print(result.name, result.age)

# 关闭Session
session.close()
4.11 使用SQLAlchemy进行复杂查询

SQLAlchemy提供了强大的查询语言,可以执行复杂的数据库查询操作。以下是一个示例:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker

# 创建Engine
engine = create_engine(db_url)

# 创建Session
Session = sessionmaker(bind=engine)
session = Session()

# 复杂查询
result = session.query(User.id, User.name, User.age).filter(User.age > 25).order_by(User.age.desc()).all()

# 打印结果
for row in result:
    print(row)

# 关闭Session
session.close()

这是一个简单的例子,SQLAlchemy的查询语言支持更复杂的操作,包括连接(join)、子查询(subquery)、聚合函数(aggregate functions)等。

4.12 SQLAlchemy的事件系统

SQLAlchemy的事件系统允许在与数据库交互的过程中插入自定义逻辑。以下是一个使用事件系统的简单例子:

from sqlalchemy import create_engine, Column, Integer, String, event
from sqlalchemy.orm import sessionmaker

# 创建Engine
engine = create_engine(db_url)

# 创建Session
Session = sessionmaker(bind=engine)
session = Session()

# 定义User模型
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    age = Column(Integer)

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

# 插入数据前的事件
@event.listens_for(User, 'before_insert')
def before_insert_listener(mapper, connection, target):
    print(f"Before insert: {
      
      target.name}")

# 插入数据
new_user = User(name='Bob', age=30)
session.add(new_user)
session.commit()

# 查询并打印结果
result = session.query(User).all()
for row in result:
    print(row.name)

# 关闭Session
session.close()

在这个例子中,before_insert_listener函数会在插入数据前被调用,可以在这里插入自定义的逻辑。

5. peewee

5.1 安装与配置

Peewee是一个轻量级的ORM库,通过以下步骤安装:

pip install peewee
5.2 数据库连接
5.2.1 SQLite 连接

使用Peewee连接SQLite数据库:

from peewee import SqliteDatabase, Model, CharField, IntegerField

# 创建SQLite数据库连接
db = SqliteDatabase('your_database.db')

# 定义模型
class BaseModel(Model):
    class Meta:
        database = db

class User(BaseModel):
    username = CharField()
    age = IntegerField()

# 连接数据库并创建表格
db.connect()
db.create_tables([User])
5.2.2 MySQL 连接

使用Peewee连接MySQL数据库:

from peewee import MySQLDatabase

# 创建MySQL数据库连接
db = MySQLDatabase('your_database', user='your_user', password='your_password', host='your_host', port=your_port)

# 定义模型
class User(BaseModel):
    username = CharField()
    age = IntegerField()

# 连接数据库并创建表格
db.connect()
db.create_tables([User])
5.2.3 PostgreSQL 连接

使用Peewee连接PostgreSQL数据库:

from peewee import PostgresqlDatabase

# 创建PostgreSQL数据库连接
db = PostgresqlDatabase('your_database', user='your_user', password='your_password', host='your_host', port=your_port)

# 定义模型
class User(BaseModel):
    username = CharField()
    age = IntegerField()

# 连接数据库并创建表格
db.connect()
db.create_tables([User])
5.3 模型定义

使用Peewee定义模型:

from peewee import Model, CharField, IntegerField

class User(Model):
    username = CharField()
    age = IntegerField()

    class Meta:
        database = db  # 指定数据库连接
5.4 查询与操作

使用Peewee进行查询和操作:

# 插入数据
user = User.create(username='John', age=30)

# 查询数据
query = User.select().where(User.age > 25)
result = list(query)

# 打印结果
for row in result:
    print(row.username, row.age)

# 更新数据
user.age = 31
user.save()

# 删除数据
user.delete_instance()
5.5 事务管理

使用Peewee进行事务管理:

# 开始事务
with  db.atomic(): 
    # 插入数据
    user = User.create(username='Alice', age=28)

    # 更新数据
    user.age = 29
    user.save()

# 提交事务
db.commit()

# 回滚事务
# 开始事务
with db.atomic():
    try:
        # 插入数据
        user1 = User.create(username='Bob', age=25)
        
        # 人为制造一个错误
        raise ValueError("Intentional error")
        
        # 插入数据
        user2 = User.create(username='Charlie', age=27)
        
    except Exception as e:
        # 发生错误时回滚事务
        db.rollback()
        print(f"Error: {
      
      e}")
5.6 使用 Peewee 进行复杂查询

Peewee提供了丰富的查询API,可以进行复杂的查询操作。以下是一个示例:

# 复杂查询
query = (User
         .select(User, fn.COUNT(Friend.id).alias('friend_count'))
         .join(Friend, JOIN.LEFT_OUTER)
         .group_by(User)
         .order_by(fn.COUNT(Friend.id).desc()))

# 打印结果
for user in query:
    print(user.username, user.age, user.friend_count)

在这个例子中,使用Peewee的查询API进行了左外连接、分组和排序,得到了一个包含用户及其朋友数量的结果集。

5.7 使用 Peewee 进行数据监听

Peewee提供了信号系统,允许在数据库交互过程中插入自定义逻辑。以下是一个使用信号系统的简单例子:

# 定义信号
@User.on_create()
def on_create_handler(model_class, instance, created):
    print(f"New user created: {
      
      instance.username}")

# 插入数据
user = User.create(username='David', age=35)

在这个例子中,当创建新用户时,on_create_handler函数会被调用,打印出新用户的用户名。

5.8 使用 Peewee 进行连接池管理

Peewee支持使用连接池,以提高性能和资源利用率。以下是一个简单的连接池使用示例:

from playhouse.pool import PooledMySQLDatabase

# 创建MySQL连接池
db = PooledMySQLDatabase('your_database', user='your_user', password='your_password', host='your_host', port=your_port, max_connections=8)

# 定义模型
class User(BaseModel):
    username = CharField()
    age = IntegerField()

# 连接数据库并创建表格
db.connect()
db.create_tables([User])

在这个例子中,使用了Peewee的PooledMySQLDatabase来创建MySQL连接池,通过max_connections参数设置连接池的最大连接数。

5.9 使用 Peewee 进行数据类型映射

Peewee会尽力将数据库中的数据类型映射为相应的Python数据类型。以下是一个简单的例子:

# 定义模型
class DataTypesModel(Model):
    int_field = IntegerField()
    char_field = CharField()
    float_field = FloatField()
    bool_field = BooleanField()

    class Meta:
        database = db  # 指定数据库连接

# 创建表格
db.create_tables([DataTypesModel])

# 插入数据
DataTypesModel.create(
    int_field=42,
    char_field='Hello',
    float_field=3.14,
    bool_field=True
)

# 查询数据
result = DataTypesModel.select().get()

# 打印结果
print(result.int_field, result.char_field, result.float_field, result.bool_field)

在这个例子中,DataTypesModel模型定义了整数、字符、浮点数和布尔值字段,Peewee会自动将数据库中的数据类型映射为相应的Python数据类型。

5.10 使用 Peewee 进行存储过程调用

Peewee也支持调用数据库中的存储过程。以下是一个简单的例子:

# 定义存储过程
class MyStoredProcedure(RawQuery):
    def __init__(self, *args, **kwargs):
        super().__init__("CALL your_stored_procedure()", *args, **kwargs)

# 调用存储过程
result = MyStoredProcedure.execute()

在这个例子中,使用了Peewee的RawQuery来定义并执行一个存储过程的调用。

5.11 使用 Peewee 进行数据监听

Peewee允许在进行数据库交互时插入自定义逻辑。以下是一个简单的例子:

# 定义信号
@User.on_create()
def on_create_handler(model_class, instance, created):
    print(f"New user created: {
      
      instance.username}")

# 插入数据
user = User.create(username='Eva', age=28)

在这个例子中,使用Peewee的信号系统,当创建新用户时,on_create_handler函数会被调用,打印出新用户的用户名。

5.12 使用 Peewee 进行批量插入

Peewee提供了insert_many方法,可以高效地执行批量插入操作。以下是一个简单的例子:

# 批量插入数据
data_to_insert = [
    {
    
    'username': 'user1', 'age': 25},
    {
    
    'username': 'user2', 'age': 30},
    {
    
    'username': 'user3', 'age': 22},
]

User.insert_many(data_to_insert).execute()

在这个例子中,使用了Peewee的insert_many方法,可以一次性插入多条数据,提高插入性能。

5.13 使用 Peewee 进行数据分页

Peewee提供了paginate方法,可以方便地进行数据分页查询。以下是一个简单的例子:

# 分页查询数据
page_size = 10
current_page = 1

query = User.select().paginate(current_page, page_size)

# 打印结果
for user in query:
    print(user.username, user.age)

在这个例子中,使用了Peewee的paginate方法,可以方便地进行数据分页查询。

6. SQLite

6.1 安装与配置

SQLite是一个轻量级的嵌入式数据库,无需独立的数据库服务器。使用以下步骤安装SQLite:

# 安装 SQLite
pip install sqlite
6.2 数据库连接
6.2.1 连接方式

使用SQLite连接数据库:

import sqlite3

# 连接SQLite数据库(内存中)
conn = sqlite3.connect(':memory:')

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

# 关闭连接
conn.close()
6.2.2 连接池管理

由于SQLite是嵌入式数据库,通常不涉及连接池管理。

6.3 SQL语法

SQLite使用标准的SQL语法,例如:

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

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

# 查询数据
cursor.execute("SELECT * FROM users WHERE age > 25")
result = cursor.fetchall()

# 打印结果
for row in result:
    print(row)
6.4 数据库操作

SQLite数据库的常见操作:

# 更新数据
cursor.execute("UPDATE users SET age = 31 WHERE name = 'John'")

# 删除数据
cursor.execute("DELETE FROM users WHERE name = 'John'")
6.5 使用事务

使用SQLite进行事务管理:

# 开始事务
conn = sqlite3.connect(':memory:')
cursor = conn.cursor()

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

    # 提交事务
    conn.commit()

except Exception as e:
    # 发生错误时回滚事务
    conn.rollback()
    print(f"Error: {
      
      e}")

finally:
    # 关闭连接
    conn.close()
6.6 数据库备份与恢复

SQLite数据库可以通过复制数据库文件进行备份。以下是一个简单的备份和恢复例子:

import shutil

# 备份数据库文件
shutil.copyfile('your_database.db', 'backup.db')

# 恢复数据库文件
shutil.copyfile('backup.db', 'your_database.db')

在这个例子中,通过shutil.copyfile函数可以复制数据库文件,实现备份和恢复的操作。

6.7 使用SQLite进行全文搜索

SQLite支持全文搜索,可以使用FTS3FTS4虚拟表。以下是一个简单的例子:

# 创建全文搜索虚拟表
cursor.execute('''
    CREATE VIRTUAL TABLE IF NOT EXISTS documents 
    USING FTS4 (content TEXT)
''')

# 插入数据
cursor.execute("INSERT INTO documents (content) VALUES ('Example text for full-text search')")

# 执行全文搜索
search_term = 'full-text'
cursor.execute(f"SELECT * FROM documents WHERE content MATCH ?;", (search_term,))
result = cursor.fetchall()

# 打印搜索结果
for row in result:
    print(row)

在这个例子中,使用FTS4虚拟表进行全文搜索,通过MATCH关键字执行搜索。

6.8 SQLite的触发器

SQLite支持触发器,可以在指定的事件发生时自动执行特定的SQL语句。以下是一个简单的例子:

# 创建触发器
cursor.execute('''
    CREATE TRIGGER IF NOT EXISTS after_insert_trigger
    AFTER INSERT ON users
    BEGIN
        UPDATE logs SET message = 'New user added' WHERE user_id = NEW.id;
    END
''')

在这个例子中,创建了一个在users表格插入数据后自动更新logs表格的触发器。

6.9 使用SQLite的索引优化

SQLite支持创建索引来优化查询性能。以下是一个简单的例子:

# 创建索引
cursor.execute("CREATE INDEX IF NOT EXISTS idx_users_age ON users (age)")

在这个例子中,创建了一个在users表格的age字段上的索引,提高了根据年龄进行查询的性能。

6.10 使用SQLite的视图

SQLite支持创建视图,可以将一个查询的结果作为虚拟表格。以下是一个简单的例子:

# 创建视图
cursor.execute('''
    CREATE VIEW IF NOT EXISTS view_young_users AS
    SELECT * FROM users WHERE age < 30
''')

在这个例子中,创建了一个名为view_young_users的视图,该视图包含users表格中年龄小于30的所有数据。

6.11 使用SQLite的用户权限管理

SQLite是一个轻量级数据库,通常无需用户权限管理,但仍然可以使用文件系统的权限进行控制。

6.12 使用SQLite进行加密

SQLite默认不提供加密功能。如果需要加密数据库,可以考虑使用一些第三方工具或库,例如SQLCipher。

6.13 SQLite的内置函数

SQLite内置了许多函数,用于执行各种操作,例如数学运算、字符串处理等。以下是一个简单的例子:

# 使用内置函数
cursor.execute("SELECT ABS(-10), LENGTH('SQLite')")
result = cursor.fetchall()

# 打印结果
for row in result:
    print(row)

在这个例子中,使用了ABSLENGTH等内置函数进行数学运算和字符串处理。

6.14 使用SQLite进行复制数据表

SQLite可以通过创建新表并插入数据的方式复制数据表。以下是一个简单的例子:

# 复制数据表
cursor.execute("CREATE TABLE IF NOT EXISTS new_users AS SELECT * FROM users")

在这个例子中,通过CREATE TABLE AS SELECT语句,可以复制users表格的结构和数据到新的表格new_users

6.15 使用SQLite进行数据转换

SQLite支持使用CAST函数进行数据类型转换。以下是一个简单的例子:

# 数据类型转换
cursor.execute("SELECT CAST(age AS TEXT) FROM users")
result = cursor.fetchall()

# 打印结果
for row in result:
    print(row)

在这个例子中,使用了CAST函数将age字段的数据类型转换为文本类型。

7. PyMongo

7.1 安装与配置

PyMongo是Python连接MongoDB数据库的库。通过以下步骤安装:

pip install pymongo

在使用之前,确保MongoDB已安装并运行,并配置连接参数。

7.2 连接MongoDB数据库

使用PyMongo连接MongoDB:

from pymongo import MongoClient

# 连接MongoDB
client = MongoClient('mongodb://your_host:your_port/')

# 选择数据库
db = client['your_database']

# 选择集合(表格)
collection = db['your_collection']
7.3 插入与查询数据

插入和查询数据:

# 插入数据
user_data = {
    
    
    'name': 'John',
    'age': 30,
    'email': '[email protected]'
}

result = collection.insert_one(user_data)

# 查询数据
query = {
    
    'age': {
    
    '$gt': 25}}
result = collection.find(query)

# 打印结果
for document in result:
    print(document)
7.4 更新与删除数据

更新和删除数据:

# 更新数据
update_query = {
    
    'name': 'John'}
update_data = {
    
    '$set': {
    
    'age': 31}}
collection.update_one(update_query, update_data)

# 删除数据
delete_query = {
    
    'age': {
    
    '$lt': 30}}
collection.delete_many(delete_query)
7.5 索引与性能优化

创建索引以优化查询性能:

# 创建索引
collection.create_index([('name', 1), ('age', -1)])

# 查询数据
query_with_index = {
    
    'name': 'John'}
result_with_index = collection.find(query_with_index)

# 打印结果
for document in result_with_index:
    print(document)
7.6 使用聚合管道

利用聚合管道进行复杂的数据处理:

# 聚合管道
pipeline = [
    {
    
    '$match': {
    
    'age': {
    
    '$gt': 25}}},
    {
    
    '$group': {
    
    '_id': '$name', 'total_age': {
    
    '$sum': '$age'}}},
    {
    
    '$sort': {
    
    'total_age': -1}},
    {
    
    '$limit': 5}
]

result_aggregation = collection.aggregate(pipeline)

# 打印结果
for document in result_aggregation:
    print(document)

在这个例子中,使用了聚合管道进行筛选、分组、排序和限制等复杂的数据处理。

7.7 使用 GridFS 存储大文件

利用GridFS存储和检索大文件:

from pymongo import MongoClient
from gridfs import GridFS

# 连接MongoDB
client = MongoClient('mongodb://your_host:your_port/')
db = client['your_database']

# 创建GridFS对象
fs = GridFS(db, collection='files')

# 上传文件
with open('large_file.txt', 'rb') as file:
    file_id = fs.put(file, filename='large_file.txt')

# 下载文件
downloaded_file = fs.get(file_id)
with open('downloaded_large_file.txt', 'wb') as file:
    file.write(downloaded_file.read())
7.8 使用 PyMongo 的事件监听器

利用PyMongo的事件监听器来处理数据库操作事件:

from pymongo import MongoClient

# 定义事件监听器
def on_insert(event):
    print(f"Document inserted: {
      
      event.document}")

# 连接MongoDB
client = MongoClient('mongodb://your_host:your_port/')
db = client['your_database']

# 注册事件监听器
db['your_collection'].with_options(
    codec_options=...,
    read_concern=...,
    write_concern=...,
    read_preference=...
).insert_one({
    
    }).inserted_id

# 插入数据(触发事件)
db['your_collection'].insert_one({
    
    'name': 'Alice'})
7.9 使用 PyMongo 进行地理空间查询

利用PyMongo进行地理空间查询:

from pymongo import MongoClient

# 连接MongoDB
client = MongoClient('mongodb://your_host:your_port/')
db = client['your_database']

# 插入地理空间数据
location_data = {
    
    
    'name': 'Central Park',
    'location': {
    
    'type': 'Point', 'coordinates': [-73.965355, 40.782865]}
}

db['locations'].insert_one(location_data)

# 查询附近的地理空间数据
nearby_query = {
    
    
    'location': {
    
    
        '$near': {
    
    
            '$geometry': {
    
    'type': 'Point', 'coordinates': [-73.9712, 40.7831]},
            '$maxDistance': 1000  # 米
        }
    }
}

result_nearby = db['locations'].find(nearby_query)

# 打印结果
for document in result_nearby:
    print(document)

在这个例子中,使用了地理空间索引和$near运算符进行附近的地理空间查询。

7.10 使用 PyMongo 进行连接池管理

利用PyMongo的连接池管理数据库连接:

from pymongo import MongoClient

# 创建连接池
client = MongoClient(
    'mongodb://your_host:your_port/',
    maxPoolSize=10,
    minPoolSize=1
)

# 获取数据库连接
db = client['your_database']

# 执行查询
result = db['your_collection'].find()

# 打印结果
for document in result:
    print(document)

在这个例子中,使用了maxPoolSizeminPoolSize参数配置连接池的大小,以便在高并发时有效地管理连接。

8. redis-py

8.1 安装与配置

redis-py是Python连接Redis数据库的库。通过以下步骤安装:

pip install redis

在使用之前,确保Redis服务器已安装并运行,并配置连接参数。

8.2 连接Redis数据库
8.2.1 单机连接

使用redis-py连接Redis单机数据库:

import redis

# 连接Redis数据库(单机)
redis_client = redis.StrictRedis(host='your_host', port=your_port, db=0)
8.2.2 集群连接

使用redis-py连接Redis集群:

from rediscluster import RedisCluster

# 连接Redis集群
redis_nodes = [{
    
    'host': 'your_host', 'port': your_port}]
redis_client = RedisCluster(startup_nodes=redis_nodes, decode_responses=True)
8.3 数据操作

使用redis-py进行数据操作:

# 设置键值对
redis_client.set('key', 'value')

# 获取值
value = redis_client.get('key')
print(value)
8.4 数据类型与存储

Redis支持多种数据类型,如字符串、列表、哈希表等:

# 存储列表
redis_client.lpush('my_list', 'item1', 'item2', 'item3') 

# 获取列表
my_list = redis_client.lrange('my_list', 0, -1)
print(my_list)
8.5 发布与订阅

使用redis-py进行发布与订阅操作:

# 发布消息
redis_client.publish('channel', 'message')

# 订阅消息
pubsub = redis_client.pubsub()
pubsub.subscribe('channel')

# 监听消息
for message in pubsub.listen():
    if message['type'] == 'message':
        print(f"Received message: {
      
      message['data']}")
8.6 过期时间与持久化

设置键的过期时间和使用持久化:

# 设置键的过期时间(秒)
redis_client.expire('key', 60)

# 持久化
redis_client.save()
8.7 分布式锁

使用redis-py实现分布式锁:

# 获取锁
lock_key = 'resource_lock'
lock_value = 'lock_value'
lock_acquired = redis_client.set(lock_key, lock_value, nx=True, ex=60)

if lock_acquired:
    try:
        # 执行需要加锁的操作
        print("Lock acquired, performing operation.")
    finally:
        # 释放锁
        redis_client.eval("if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end", 1, lock_key, lock_value)
else:
    print("Failed to acquire lock.")
8.8 使用连接池

利用redis-py的连接池管理数据库连接:

from redis import ConnectionPool, StrictRedis

# 创建连接池
pool = ConnectionPool(host='your_host', port=your_port, db=0)

# 创建Redis客户端
redis_client = StrictRedis(connection_pool=pool)

# 执行查询
result = redis_client.get('key')

# 打印结果
print(result)
8.9 使用 Lua 脚本

利用redis-py执行 Lua 脚本:

# 执行 Lua 脚本
lua_script = """
    return redis.call('get', KEYS[1])
"""
result = redis_client.eval(lua_script, 1, 'key')

# 打印结果
print(result)
8.10 使用 Pipeline

利用redis-py的 Pipeline 执行批量操作:

# 创建 Pipeline
pipeline = redis_client.pipeline()

# 批量设置键值对
pipeline.set('key1', 'value1')
pipeline.set('key2', 'value2')

# 批量获取值
pipeline.get('key1')
pipeline.get('key2')

# 执行 Pipeline 操作
results = pipeline.execute()

# 打印结果
for result in results:
    print(result)
8.11 使用 Geo 数据类型

利用redis-py的 Geo 数据类型进行地理位置操作:

# 添加地理位置
redis_client.geoadd('locations', {
    
    'Paris': (2.3522, 48.8566), 'New York': (-74.006, 40.7128)})

# 获取两地距离
distance = redis_client.geodist('locations', 'Paris', 'New York', unit='km')

# 打印结果
print(f'Distance between Paris and New York: {
      
      distance} km')
8.12 使用 HyperLogLog

利用redis-py的 HyperLogLog 进行基数估计:

# 添加元素到 HyperLogLog
redis_client.pfadd('unique_users', 'user1', 'user2', 'user3')

# 获取基数估计
cardinality = redis_client.pfcount('unique_users')

# 打印结果
print(f'Estimated cardinality: {
      
      cardinality}')
8.13 使用 Bit 数据类型

利用redis-py的 Bit 数据类型进行位操作:

# 设置位
redis_client.setbit('bit_key', 2, 1)

# 获取位值
bit_value = redis_client.getbit('bit_key', 2)

# 打印结果
print(f'Bit value at position 2: {
      
      bit_value}')
8.14 使用 Scan 迭代键

利用redis-py的 Scan 迭代键,避免阻塞:

# 使用 Scan 迭代键
for key in redis_client.scan_iter(match='prefix*'):
    print(f'Key: {
      
      key}')

9. Firebase Admin SDK

9.1 安装与配置

Firebase Admin SDK是Python连接Firebase Realtime Database的库。通过以下步骤安装:

pip install firebase-admin

在使用之前,需要创建Firebase项目并下载配置文件(JSON格式),然后在项目中引入配置文件。

9.2 连接Firebase Realtime Database

使用Firebase Admin SDK连接Firebase Realtime Database:

import firebase_admin
from firebase_admin import credentials, db

# 初始化Firebase
cred = credentials.Certificate('path/to/your/firebase/credentials.json')
firebase_admin.initialize_app(cred, {
    
    'databaseURL': 'https://your-project-id.firebaseio.com/'})

# 获取数据库引用
ref = db.reference('/')
9.3 数据操作

使用Firebase Admin SDK进行数据操作:

# 写入数据
ref.set({
    
    'key': 'value'})

# 读取数据
data = ref.get()
print(data)
9.4 数据监听与同步

使用Firebase Admin SDK实现数据监听与同步:

# 监听数据变化
def on_data_change(event):
    print('Data changed:', event.data)

ref.listen(on_data_change)

# 在Firebase控制台上更改数据,触发监听事件
9.5 安全规则管理

Firebase Realtime Database具有安全规则,用于限制对数据库的访问。这可以在Firebase控制台上配置。

Firebase Admin SDK通过管理员权限连接数据库,无视规则。在生产环境中,务必谨慎使用管理员权限,并根据实际需求配置安全规则。

以上是有关数据库连接和操作的大纲及相关 Python 库的简介。每一章的实例代码都提供了基本的使用方法,您可以根据需要进一步深入学习和应用这些库。在实际项目中,选择合适的数据库库取决于项目需求、性能要求和个人偏好。

9.6 多数据库连接

Firebase Admin SDK支持连接到多个Firebase项目的数据库。这在需要在一个应用程序中同时访问多个数据库时非常有用。

# 初始化第二个Firebase项目
second_cred = credentials.Certificate('path/to/your/second/firebase/credentials.json')
second_app = firebase_admin.initialize_app(second_cred, {
    
    'databaseURL': 'https://second-project-id.firebaseio.com/'}, name='second')

# 获取第二个数据库引用
second_ref = db.reference('/', app=second_app)

# 写入第二个数据库
second_ref.set({
    
    'key': 'value in second database'})

# 读取第二个数据库
second_data = second_ref.get()
print(second_data)
9.7 使用Firebase Authentication

Firebase Admin SDK还可以与Firebase Authentication一起使用,以管理用户身份验证和访问控制。

from firebase_admin import auth

# 创建用户
user = auth.create_user(
    email='[email protected]',
    email_verified=False,
    password='password',
    display_name='John Doe',
    disabled=False
)

# 获取用户信息
user = auth.get_user(uid=user.uid)
print(user)

# 更新用户信息
updated_user = auth.update_user(
    uid=user.uid,
    display_name='John Updated',
    email_verified=True
)

# 删除用户
auth.delete_user(uid=user.uid)
9.8 使用Firebase Cloud Messaging (FCM)

Firebase Admin SDK允许您与Firebase Cloud Messaging集成,实现推送通知功能。

from firebase_admin import messaging

# 创建消息
message = messaging.Message(
    data={
    
    'score': '850', 'time': '2:45'},
    token='device_token'
)

# 发送消息
response = messaging.send(message)
print('Successfully sent message:', response)
9.9 使用Firebase Storage

Firebase Admin SDK支持连接到Firebase Storage,用于存储和检索文件。

from firebase_admin import storage

# 获取Storage引用
storage_ref = storage.reference()

# 上传文件
blob = storage_ref.child('path/to/file.txt').put(b'File content')

# 下载文件
download_url = storage_ref.child('path/to/file.txt').get_url()
print('Download URL:', download_url)
9.10 使用Firebase Remote Config

Firebase Admin SDK还支持与Firebase Remote Config集成,动态配置应用程序的参数。

from firebase_admin import remote_config

# 获取Remote Config客户端
config = remote_config.Client()

# 设置参数
config.set_parameters({
    
    'param_key': 'param_value'})

# 发布更新
config.publish()

# 获取参数值
param_value = config.get('param_key').get()
print('Parameter value:', param_value)
9.11 使用Firebase Analytics

Firebase Admin SDK可以与Firebase Analytics集成,实现应用程序性能监控和用户行为分析。

from firebase_admin import analytics

# 设置用户属性
analytics.set_user_property('favorite_food', 'pizza')

# 记录事件
analytics.log_event('purchase', {
    
    'item_id': 'abc123', 'quantity': 1})
9.12 自定义令牌生成

Firebase Admin SDK允许您生成自定义身份验证令牌,用于实现自定义身份验证流程。

# 生成自定义身份验证令牌
custom_token = auth.create_custom_token(uid='user_id')
print('Custom token:', custom_token)

以上是Firebase Admin SDK的更多用法,包括多数据库连接、用户身份验证、推送通知、存储、远程配置、分析等功能。每个功能都可以根据实际项目需求进行深入学习和应用。

总结

通过阅读本文,读者将获得以下收获:

  • 了解常用数据库连接库(psycopg2、MySQL Connector、pyodbc)的基本用法,包括安装、配置和基本连接。
  • 理解事务管理的重要性,学会在不同库中进行事务操作,确保数据的完整性。
  • 探索ORM框架(SQLAlchemy和peewee)的优势,学会使用面向对象的方式进行数据库操作。
  • 了解非关系型数据库(MongoDB、Redis)和云端实时数据库(Firebase)的连接和基本操作。

猜你喜欢

转载自blog.csdn.net/qq_42531954/article/details/135372940