A Python library for using SQL
Inspired by the excellent Yesql library by Kris Jenkins. In my mother tongue, ano means yes.
$ pip install anosql
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']
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)
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)
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.
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)
$ pip install tox $ tox
Postgresql and sqlite only at the moment
BSD, short and sweet