跳转到主要内容

Python中的简单SQL

项目描述

SQL是代码。编写它、版本控制它、注释它,并通过文件运行它。将SQL代码作为字符串写入Python程序不允许您轻松地在SQL GUI或CLI工具(如psql)中重用。使用aiosql,您可以在.sql文件中组织SQL语句,将它们作为方法加载到您的Python应用程序中,以便调用,同时不会失去像使用任何其他SQL文件一样使用它们的能力。

本项目支持标准 PEP 249 和基于 asyncioSQLite (sqlite3, aiosqlite, apsw), PostgreSQL (psycopg (3), psycopg2, pg8000, pygresql, asyncpg), MySQL (PyMySQL, mysqlclient, mysql-connector, asyncmy 使用 此适配器), MariaDB (mariadb), DuckDB (duckdb) 以及 MS SQL Server (pymssql) 的驱动程序。然而,某些详细功能支持可能因底层驱动程序和数据库引擎的实际功能而异。

支持 pyformatnamed PEP 249 参数样式的其他 SQL 数据库驱动程序也应该可以工作,只需在构建查询时将驱动程序作为参数传递即可。因此,Oracle 数据库 (oracledb) 或 Snowflake (snowflake.connector) 应该可以即插即用……如果它实际对您有效,请提交问题!否则,您可以编写扩展来支持其他数据库驱动程序!请参阅:数据库驱动程序适配器。欢迎提交 pull request!

此模块是 Kris Jenkins’ yesql Clojure 库在 Python 生态系统 中的实现。

徽章

Build status Code Coverage Tests Issues Contributors Pypi Downloads Stars Version Code Size Databases Drivers Language Count Top Language Python Versions Badges BSD 2-Clause License

用法

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!
    # …

甚至以异步方式,使用 aiosqliteasyncio 并行运行两个 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。

  • 您没有使用像SQLAlchemyDjango这样的ORM,其代码量(100k行)远大于aiosql的900行,您也不需要。

  • 您希望在其它环境中重复使用SQL。将其加载到psql或其他数据库工具中。

您可能不希望使用这个的原因

  • 您正在寻找ORM

  • 您不习惯编写SQL代码。

  • 您的应用程序中没有需要复杂SQL的功能,只需基本的CRUD操作。

  • 运行时动态加载的对象真的让您感到烦恼。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。

源分布

aiosql-12.2.tar.gz (72.4 kB 查看哈希值)

上传时间

构建分布

aiosql-12.2-py3-none-any.whl (23.6 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面