python中的简单sql

anosql的Python项目详细描述


https://badge.fury.io/py/anosql.svgDocumentation Statushttps://travis-ci.org/honza/anosql.svg?branch=master

使用sql的python库

灵感来自克里斯詹金斯的优秀图书馆。在我母亲身上 舌头,ano表示yes

如果您在python3.6+上,或者需要anosql来使用基于asyncio的数据库驱动程序。 请参阅相关项目aiosql

安装

$ pip install anosql

用法

基础知识

给定一个queries.sql文件:

-- name: get-all-greetings
-- Get all the greetings in the database
SELECT*FROMgreetings;-- name: $select-users
-- Get all the users from the database,
-- and return it as a dict
SELECT*FROMUSERS;

我们可以发出sql查询,例如:

importanosqlimportpsycopg2importsqlite3# PostgreSQLconn=psycopg2.connect('...')queries=anosql.from_path('queries.sql','psycopg2')# Or, Sqlite3...conn=sqlite3.connect('cool.db')queries=anosql.from_path('queries.sql','sqlite3)queries.get_all_greetings(conn)# => [(1, 'Hi')]queries.get_all_greetings.__doc__# => Get all the greetings in the databasequeries.get_all_greetings.sql# => SELECT * FROM greetings;queries.available_queries# => ['get_all_greetings']

参数

通常,您希望动态更改查询的某些部分,特别是 WHERE子句。您可以使用参数来执行此操作:

-- name: get-greetings-for-language-and-length
-- Get all the greetings in the database
SELECT*FROMgreetingsWHERElang=%s;

它们成为位置参数:

visitor_language="en"queries.get_all_greetings(conn,visitor_language)

命名参数

为了使具有许多参数的查询更易于理解和维护,您可以 可以给出参数名称:

-- name: get-greetings-for-language-and-length
-- Get all the greetings in the database
SELECT*FROMgreetingsWHERElang=:langANDlen(greeting)<=:length_limit;

如果您正在编写postgresql查询,还可以将参数格式化为 %s(lang)%s(length_limit)

然后,调用查询,就像调用 参数:

visitor_language="en"greetings_for_texting=queries.get_all_greetings(conn,lang=visitor_language,length_limit=140)

更新/插入/删除

为了运行UPDATEINSERTDELETE语句,您需要 将!添加到查询名称的末尾。然后anosql将正确执行它。 它还将返回受影响的行数。

插入返回自动生成值的查询

如果希望在运行 插入查询,您可以将<!添加到查询名称的末尾。

-- name: create-user<!
INSERTINTOperson(name)VALUES(:name)

添加自定义查询加载程序。

开箱即用anosql通过stdlibsqlite3数据库驱动程序支持sqlite和postgresql 和psycopg2。如果要扩展anosql以与其他类型的数据库通信 您可以创建一个驱动程序adapeter类并用anosql.register_driver_adapter()注册它。

驱动程序适配器是遵循以下接口的duck类型的类。查看anosql/adapters包 通过查看psycopg2sqlite3适配器是如何工作的,可以从这里开始。

注册新加载程序:

import anosql

class MyDbAdapter():
    def process_sql(self, name, op_type, sql):
        pass

    def select(self, conn, sql, parameters):
        pass

    @contextmanager
    def select_cursor(self, conn, sql, parameters):
        pass

    def insert_update_delete(self, conn, sql, parameters):
        pass

    def insert_update_delete_many(self, conn, sql, parameters):
        pass

    def insert_returning(self, conn, sql, parameters):
        pass

    def execute_script(self, conn, sql):
        pass


anosql.register_driver_adapter("mydb", MyDbAdapter)

# To use make a connection to your db, and pass "mydb" as the db_type:
import mydbdriver
conn = mydbriver.connect("...")

anosql.load_queries("path/to/sql/", "mydb")
greetings = anosql.get_greetings(conn)

conn.close()

如果适配器构造函数接受参数,则可以注册可以生成 适配器实例:

def adapter_factory():
    return MyDbAdapter("foo", 42)

anosql.register_driver_adapter("mydb", adapter_factory)

测试

$ pip install tox
$ tox

许可证

短而甜的bsd

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java NetBeans无法找到组织。postgresql。ds。PGSimpleDataSource驱动程序   java如何使用spring data mongodb查询引用无效的文档   jsonpath java。lang.NoSuchFieldError:defaultReader   java MissingResourceException:找不到基本名称资源的捆绑包。控制。控件\u res,区域设置en   使用cordova时出现java_HOME错误   java接口、泛型和重构   安卓 Java最佳实践:嵌套getter?还是代表?   java在应用程序中需要尾部斜杠。xml   java不兼容类型:lambda表达式中的错误返回类型| void不是函数接口   实体中的java空数据,但在发送时不为空。怎么可能呢?   java equal运算符如何处理基元和对象类型数据   java在postgresql(spring)中设置默认模式   java在TreeMap、HashMap或LinkedHashMap中使用重复键存储值   如何让springboot@Async与Java 8协同工作   java向JPanel添加内容   javascript扫描三维模型外表面并使用Autodesk forge API创建模型副本