修改日志
修改日期 | 修改内容 |
---|---|
2024.04.10 | 归纳:Dialects 使用指南 |
使用的版本
使用命令"pip show sqlachemy"可以显示该库的相关信息,大致信息如下:
- 版本号Version:2.0.29
- SQLAlchemy官方网站:www.sqlalchemy.org/
- 依赖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库中的类与方法对数据库进行操作时,代码大致相同,只在创建数据库引擎时略有不同。
- 导入sqlalchemy库中的类与方法,供后续代码调用
Python
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
- 创建数据库引擎
数据源名称(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 连接、连接超时等。
- 创建元数据对象
Python
# 创建元数据对象
metadata = MetaData()
# 定义表格:仅供演示作用,实际生产中利用ORM优化
users = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('age', Integer))
# 创建表格
metadata.create_all(engine)
- 对数据库的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 中,where
和 filter
都是用于指定查询条件的方法,但它们在用法上略有不同。
使用 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 函数、子查询等特殊功能的情况。