Upgrading

Upgrading from 0.x to 1.x

Changed load_queries and load_queries_from_string

These methods were changed, mostly for brevity. To load anosql queries, you should now use the anosql.from_str to load queries from a SQL string, and anosql.from_path to load queries from a SQL file, or directory of SQL files.

Removed the $ “record” operator

Because most database drivers have more efficient, robust, and featureful ways of controlling the rows and records output, this feature was removed.

See:

SQLite example:

conn = sqlite3.connect("...")
conn.row_factory = sqlite3.Row
actual = queries.get_all_users(conn)

assert actual[0]["userid"] == 1
assert actual[0]["username"] == "bobsmith"
assert actual[0][2] == "Bob"
assert actual[0]["lastname" == "Smith"

PostgreSQL example:

with psycopg2.connect("...", cursor_factory=psycopg2.extras.RealDictCursor) as conn:
    actual = queries.get_all_users(conn)

assert actual[0] == {
    "userid": 1,
    "username": "bobsmith",
    "firstname": "Bob",
    "lastname": "Smith",
}

Driver Adapter classes instead of QueryLoader

I’m not aware of anyone who actually has made or distributed an extension for anosql, as it was only available in its current form for a few weeks. So this notice is really just for completeness.

For 0.3.x versions of anosql in order to add a new database extensions you had to build a subclass of anosql.QueryLoader. This base class is no longer available, and driver adapters no longer have to extend from any class at all. They are duck-typed classes which are expected to adhere to a standard interface. For more information about this see Extending anosql.

New Things

Use the database driver cursor directly

All the queries with a SELECT type have a duplicate method suffixed by _cursor which is a context manager to the database cursor. So get_all_blogs(conn) can also be used as:

rows = queries.get_all_blogs(conn)
# [(1, "My Blog", "yadayada"), ...]

with queries.get_all_blogs_cursor(conn) as cur:
    # All the power of the underlying cursor object! Not limited to just a list of rows.
    for row in cur:
        print(row)

New operator types for runnings scripts # and bulk-inserts *!

See Query Operations