Python中的简单SQL
项目描述
SQL是代码。编写它、版本控制它、注释它,并通过文件运行它。将SQL代码作为字符串写入Python程序不允许您轻松地在SQL GUI或CLI工具(如psql)中重用。使用aiosql,您可以在.sql文件中组织SQL语句,将它们作为方法加载到您的Python应用程序中,以便调用,同时不会失去像使用任何其他SQL文件一样使用它们的能力。
本项目支持标准 PEP 249 和基于 asyncio 的 SQLite (sqlite3, aiosqlite, apsw), PostgreSQL (psycopg (3), psycopg2, pg8000, pygresql, asyncpg), MySQL (PyMySQL, mysqlclient, mysql-connector, asyncmy 使用 此适配器), MariaDB (mariadb), DuckDB (duckdb) 以及 MS SQL Server (pymssql) 的驱动程序。然而,某些详细功能支持可能因底层驱动程序和数据库引擎的实际功能而异。
支持 pyformat 或 named PEP 249 参数样式的其他 SQL 数据库驱动程序也应该可以工作,只需在构建查询时将驱动程序作为参数传递即可。因此,Oracle 数据库 (oracledb) 或 Snowflake (snowflake.connector) 应该可以即插即用……如果它实际对您有效,请提交问题!否则,您可以编写扩展来支持其他数据库驱动程序!请参阅:数据库驱动程序适配器。欢迎提交 pull request!
此模块是 Kris Jenkins’ yesql Clojure 库在 Python 生态系统 中的实现。
徽章
用法
从 pypi 安装,例如通过运行 pip install aiosql。
然后在一个文件中编写参数化 SQL 查询,并从 Python 方法中执行它,例如这个 greetings.sql 文件
-- name: get_all_greetings
-- Get all the greetings in the database
select greeting_id, greeting
from greetings
order by 1;
-- name: get_user_by_username^
-- Get a user from the database using a named parameter
select user_id, username, name
from users
where username = :username;
此示例有一个虚构的 SQLite 数据库,其中包含问候和用户。它将各种语言的问候语打印给用户,并展示了能够从 SQL 文件加载查询并在 Python 代码中按名称调用它们的基本功能。
您可以使用 aiosql 从此文件中加载查询以在您的 Python 应用程序中使用
import aiosql
import sqlite3
queries = aiosql.from_path("greetings.sql", "sqlite3")
with sqlite3.connect("greetings.db") as conn:
user = queries.get_user_by_username(conn, username="willvaughn")
# user: (1, "willvaughn", "William")
for _, greeting in queries.get_all_greetings(conn):
# scan: (1, "Hi"), (2, "Aloha"), (3, "Hola"), …
print(f"{greeting}, {user[2]}!")
# Hi, William!
# Aloha, William!
# …
甚至以异步方式,使用 aiosqlite 和 asyncio 并行运行两个 SQL 查询
import asyncio
import aiosql
import aiosqlite
queries = aiosql.from_path("greetings.sql", "aiosqlite")
async def main():
# Parallel queries!!!
async with aiosqlite.connect("greetings.db") as conn:
greetings, user = await asyncio.gather(
queries.get_all_greetings(conn),
queries.get_user_by_username(conn, username="willvaughn")
)
for _, greeting in greetings:
print(f"{greeting}, {user[2]}!")
asyncio.run(main())
在每个调用中提供连接可能看起来不太方便。您可以看看 AnoDB DB 类,它将数据库连接和查询封装在一个类似连接的扩展对象中,包括管理池并在需要时自动重新连接。
为什么您可能想使用这个
您认为 SQL 很好,并且编写 SQL 是您应用程序的重要组成部分。
您不想在 Python 代码中混合字符串编写 SQL。
您没有使用像SQLAlchemy或Django这样的ORM,其代码量(100k行)远大于aiosql的900行,您也不需要。
您希望在其它环境中重复使用SQL。将其加载到psql或其他数据库工具中。
您可能不希望使用这个的原因
您正在寻找ORM。
您不习惯编写SQL代码。
您的应用程序中没有需要复杂SQL的功能,只需基本的CRUD操作。
运行时动态加载的对象真的让您感到烦恼。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。