anosql
A Python library for using SQL
Inspired by the excellent Yesql library by Kris Jenkins. In my mother tongue, ano means yes.
Installation
$ pip install anosql
Usage
Basics
Given a queries.sql
file:
-- name: get-all-greetings
-- Get all the greetings in the database
SELECT * FROM greetings;
We can issue SQL queries, like so:
import anosql
import psycopg2
import sqlite3
# PostgreSQL
conn = psycopg2.connect('...')
queries = anosql.load_queries('postgres', 'queries.sql')
# Or, Sqlite3...
conn = sqlite3.connect('cool.db')
queries = anosql.load_queries('sqlite', 'queries.sql')
queries = queries.get_all_greetings(conn)
# => [(1, 'Hi')]
queries.get_all_greetings.__doc__
# => Get all the greetings in the database
queries.get_all_greetings.__query__
# => SELECT * FROM greetings;
queries.available_queries
# => ['get_all_greetings']
Parameters
Often, you want to change parts of the query dynamically, particularly values in
the WHERE
clause. You can use parameters to do this:
-- name: get-greetings-for-language-and-length
-- Get all the greetings in the database
SELECT *
FROM greetings
WHERE lang = %s;
And they become positional parameters:
visitor_language = "en"
queries.get_all_greetings(conn, visitor_language)
Named Parameters
To make queries with many parameters more understandable and maintainable, you can give the parameters names:
-- name: get-greetings-for-language-and-length
-- Get all the greetings in the database
SELECT *
FROM greetings
WHERE lang = :lang
AND len(greeting) <= :length_limit;
If you were writing a Postgresql query, you could also format the parameters as
%s(lang)
and %s(length_limit)
.
Then, call your queries like you would any Python function with named parameters:
visitor_language = "en"
greetings_for_texting = queries.get_all_greetings(
conn, lang=visitor_language, length_limit=140)
Update/Insert/Delete
In order to run UPDATE
, INSERT
, or DELETE
statements, you need to
add !
to the end of your query name. Anosql will then execute it properly.
It will also return the number of affected rows.
Insert queries returning autogenerated values
If you want the auto-generated primary key to be returned after you run an
insert query, you can add <!
to the end of your query name.
-- name: create-user<!
INSERT INTO person (name) VALUES (:name)
Tests
$ pip install tox $ tox
Caveats
Postgresql and sqlite only at the moment
License
BSD, short and sweet