Python Database —— SQLAlchemy Dialects 使用指南

修改日志

修改日期 修改内容
2024.04.10 归纳:Dialects 使用指南

使用的版本

使用命令"pip show sqlachemy"可以显示该库的相关信息,大致信息如下:

  1. 版本号Version:2.0.29
  2. SQLAlchemy官方网站:www.sqlalchemy.org/
  3. 依赖Requires:greenlet, typing-extensions

其他信息无需赘述。

Terminal 复制代码
(.venv) PS D:\Applications\LearningCases\learn_sqlalchemy> pip show sqlalchemy
Name: SQLAlchemy
Version: 2.0.29
Summary: Database Abstraction Library
Home-page: https://www.sqlalchemy.org
Author: Mike Bayer
Author-email: mike_mp@zzzcomputing.com
License: MIT
Location: D:\Applications\LearningCases\learn_sqlalchemy\.venv\Lib\site-packages
Requires: greenlet, typing-extensions
Required-by:

Dialects 使用指南

Dialects 优缺点

SQLite

优点:

  • 轻量级,易于使用和部署。
  • 零配置,不需要服务器,直接访问本地文件。
  • 开源免费,与大多数编程语言集成良好。
  • 支持跨平台运行。
  • 对于嵌入式设备和小型应用程序非常适用。

缺点:

  • 不适合高并发、大规模的数据库操作。
  • 不支持客户端/服务器架构,只能用于单用户或轻量级的多用户应用。
  • 功能相对较少,不支持诸如存储过程、触发器等高级功能。
  • 性能可能不如其他数据库管理系统。

PostgreSQL

优点:

  • 开源免费,功能强大。
  • 高度可扩展,支持复杂的数据类型和查询。
  • 强大的事务支持和完善的并发控制。
  • 提供了丰富的标准和扩展功能,如地理信息系统(GIS)支持、全文搜索等。
  • 具有良好的安全性和稳定性。

缺点:

  • 相对于 MySQL,一些基本任务可能需要更多的配置和管理。
  • 在某些情况下,性能可能不如其他数据库。

MySQL

优点:

  • 开源免费,社区版可免费使用。
  • 高性能,支持大量并发连接。
  • 良好的可扩展性和灵活性。
  • 大型开源社区支持,有丰富的文档和资源。
  • 广泛应用于 Web 应用程序和小型企业。

缺点:

  • 对于复杂的事务支持不如其他商业数据库。
  • 在某些情况下,可靠性和安全性可能受到一些质疑。
  • 缺少一些高级功能,如全文搜索、在线备份等。

MSSQL (Microsoft SQL Server)

优点:

  • 强大的管理工具和图形用户界面。
  • 集成了广泛的 Microsoft 技术,如 .NET 框架和 Visual Studio。
  • 提供了高度可靠性和安全性。
  • 具有良好的事务支持和并发控制。
  • 支持复杂的查询和存储过程。
  • 支持大规模的企业级数据库。

缺点:

  • 商业软件,需要购买许可证。
  • 在非 Windows 平台上的支持较弱。
  • 可扩展性有限,需要额外付费的解决方案。

Oracle

优点:

  • 强大的性能和可扩展性。
  • 提供了广泛的高级功能,如高级安全性、高级分析和数据挖掘等。
  • 优秀的事务支持和并发控制。
  • 支持大型企业级数据库。
  • 提供了完整的管理工具和支持。

缺点:

  • 商业软件,价格昂贵。
  • 在小型项目或个人开发中可能过于复杂。
  • 相对于其他数据库,学习曲线较陡峭。

实例与解析

在使用sqlalchemy库中的类与方法对数据库进行操作时,代码大致相同,只在创建数据库引擎时略有不同。

  1. 导入sqlalchemy库中的类与方法,供后续代码调用
Python 复制代码
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
  1. 创建数据库引擎

数据源名称(Data Source Name)是一种用于标识数据库连接信息的命名约定,通常在操作系统的数据源管理中定义和配置。

Python 复制代码
# 以下是不同 Dialect 创建数据库引擎中,数据库统一资源定位符的细微不同:
# (选用其中一个)
SQLALCHEMY_DATABASE_URL = 'sqlite:///example.db'
SQLALCHEMY_DATABASE_URL = 'postgresql://{DATABASE_USERNAME}:{DATABASE_PASSWORD}@{DATABASE_HOST}:{DATABASE_PORT}/{DATABASE_DB_NAME}'
SQLALCHEMY_DATABASE_URL = 'mysql://{DATABASE_USERNAME}:{DATABASE_PASSWORD}@{DATABASE_HOST}:{DATABASE_PORT}/{DATABASE_DB_NAME}'
SQLALCHEMY_DATABASE_URL = 'mssql+pyodbc://{DATABASE_USERNAME}:{DATABASE_PASSWORD}@{DATA_SOURCE_NAME}'
SQLALCHEMY_DATABASE_URL = 'oracle://{DATABASE_USERNAME}:{DATABASE_PASSWORD}@{DATABASE_HOST}:{DATABASE_PORT}/{SERVICE_NAME}'

# 创建数据库引擎
engine = create_engine(SQLALCHEMY_DATABASE_URL, pool, pool_size, echo, max_overflow, pool_timeout, pool_recycle, pool_pre_ping)

在实际应用中,为使代码易于修改和维护,使用全大写字母命名常量,将常量拼接成为统一资源定位符URL。在创建数据库引擎create_engine时,要结合实际业务设置各个数据库参数,其需要设置的参数大致如下:

  • 数据库 URL(url :指定数据库的连接信息,包括数据库类型、用户名、密码、主机地址、端口号、数据库名称等。具体的 URL 格式取决于所使用的数据库引擎。
  • 连接池(pool :指定一个连接池对象,用于管理数据库连接的复用和池化。连接池可以提高数据库连接的性能和效率,减少连接的开销。
  • 连接池大小(pool_size :指定连接池中的连接数目。可以是一个整数,表示连接池中的固定连接数,也可以是一个包含最小连接数和最大连接数的元组。
  • 最大连接数(max_overflow :指定连接池中允许的最大连接数。当连接池中的连接数已达到最大连接数时,如果有新的连接请求到来,会触发 "溢出",即超过最大连接数的连接将被创建。
  • 超时时间(pool_timeout :指定从连接池获取连接的超时时间,单位为秒。当连接池中没有可用连接时,会等待一定时间后超时返回。
  • 自动提交(echo :设置是否在执行 SQL 语句时自动提交事务。如果为 True,则每次执行 SQL 语句后会自动提交事务;如果为 False,则需要手动调用 commit() 方法来提交事务。
  • 连接编码(encoding :指定连接的字符编码,用于在连接到数据库时设置数据库会话的字符编码。
  • 连接参数 :除了上述常见参数外,create_engine 方法还接受一系列可选参数,用于配置和定制数据库连接的各种参数,如 SSL 连接、连接超时等。
  1. 创建元数据对象
Python 复制代码
# 创建元数据对象
metadata = MetaData()
# 定义表格:仅供演示作用,实际生产中利用ORM优化
users = Table('users', metadata,
              Column('id', Integer, primary_key=True),
              Column('name', String),
              Column('age', Integer))
# 创建表格
metadata.create_all(engine)
  1. 对数据库的CRUD操作

CRUD操作是由 IBM 的研究员 H. P. Luhn 在 1960 年代提出的,作为数据库系统设计的一部分。如今,CRUD操作也被广泛应用于软件开发中的其他领域,如 Web 开发等。无论是哪个领域,CRUD 操作都是构建数据驱动应用程序的基础,是实现对数据进行操作和管理的重要手段。

  • 创建(Create) :向数据存储中新增数据记录。
  • 读取(Read) :从数据存储中检索数据记录。
  • 更新(Update) :修改数据存储中的现有数据记录。
  • 删除(Delete) :从数据存储中移除数据记录。
Python 复制代码
# Create:插入数据
with engine.connect() as conn:
    conn.execute(users.insert(), [{'name': 'Alice', 'age': 30},
                                   {'name': 'Bob', 'age': 35},
                                   {'name': 'Charlie', 'age': 25}])

# Read:查询数据
with engine.connect() as conn:
    result = conn.execute(select([users]))
    for row in result:
        print(row)

# Update:更新数据
with engine.connect() as conn:
    conn.execute(users.update().where(users.c.name == 'Alice').values(age=31))

# Delete:删除数据
with engine.connect() as conn:
    conn.execute(users.delete().where(users.c.name == 'Charlie'))

Q&A

1. where() 和 filter()

在 SQLAlchemy 中,wherefilter 都是用于指定查询条件的方法,但它们在用法上略有不同。

使用 where()

  • where 方法通常用于直接构造 SQL 语句的情况,它可以接受 SQL 表达式作为参数,并将该表达式作为 WHERE 子句的一部分,直接影响到生成的 SQL 查询语句。
  • where 方法适用于需要直接指定复杂条件的情况,或者需要使用 SQL 函数、子查询等特殊功能的情况。
Python 复制代码
from sqlalchemy import text

# 使用 where 方法构造查询
query = session.query(User).where(text("age > 25"))

使用 filter()

  • filter 方法通常用于构造查询过滤条件的情况,它可以接受 SQLAlchemy 表达式作为参数,并将该表达式作为查询的过滤条件,影响到生成的 SQL 查询语句的 WHERE 子句部分。
  • filter 方法适用于大多数情况下的查询过滤操作,它支持链式调用,可以方便地构建复杂的查询条件。
Python 复制代码
# 使用 filter 方法构造查询
query = session.query(User).filter(User.age > 25)

总的来说,通常情况下优先使用 filter 方法,因为它更加灵活、方便,并且支持链式调用,可以轻松构建复杂的查询条件。而 where 方法更适合于需要直接指定 SQL 表达式的情况,或者需要使用 SQL 函数、子查询等特殊功能的情况。

相关推荐
0zxm1 小时前
06 - Django 视图view
网络·后端·python·django
m0_748257181 小时前
Spring Boot FileUpLoad and Interceptor(文件上传和拦截器,Web入门知识)
前端·spring boot·后端
小_太_阳2 小时前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
智慧老师2 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
搬码后生仔3 小时前
asp.net core webapi项目中 在生产环境中 进不去swagger
chrome·后端·asp.net
凡人的AI工具箱3 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite
Lx3524 小时前
Pandas数据重命名:列名与索引为标题
后端·python·pandas
小池先生4 小时前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
百罹鸟4 小时前
【vue高频面试题—场景篇】:实现一个实时更新的倒计时组件,如何确保倒计时在页面切换时能够正常暂停和恢复?
vue.js·后端·面试
小蜗牛慢慢爬行5 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate