Skip to main content

Individualize the queries of a SQL script and make them easily addressable

Project description

What is this library ?

This library allows to make a SQL script (or possibly any script) addressable. Once preprocessed or parsed, you can get any chunk of it (which could be a single query for instance) with its line number, key, or index of the chunk.

Example & How to use:

With a target SQL script : (toggle)

raw_script.sql :

CREATE TEMPORARY VIEW fibonacci (a, index_) AS
WITH RECURSIVE inner_fibo(b, c, index_) AS (
    SELECT 0, 1, 0
    UNION
    SELECT c, c + b, index_ + 1
    FROM inner_fibo
)
SELECT b, index_ FROM inner_fibo;

SELECT * FROM fibonacci LIMIT 1 OFFSET 3;
SELECT * FROM fibonacci LIMIT 1 OFFSET 4;
SELECT * FROM fibonacci LIMIT 1 OFFSET 5;
SELECT * FROM fibonacci LIMIT 1 OFFSET 10;


CREATE TEMPORARY TABLE test_table (a integer) STRICT;
We modify the above script by adding the following delimiter :
 -- % key
where key is the string that will reference a particular chunk of the script that we want to separate and make addressable. Note the prepended space. The delimiter is modifiable. For instance :

raw_script.sql :

 -- % fibonacci_view_creation
CREATE TEMPORARY VIEW fibonacci (a, index_) AS
WITH RECURSIVE inner_fibo(b, c, index_) AS (
    SELECT 0, 1, 0
    UNION
    SELECT c, c + b, index_ + 1
    FROM inner_fibo
)
SELECT b, index_ FROM inner_fibo;

 -- % contiguous_view_tests
SELECT * FROM fibonacci LIMIT 1 OFFSET 3;
SELECT * FROM fibonacci LIMIT 1 OFFSET 4;
SELECT * FROM fibonacci LIMIT 1 OFFSET 5;
 -- % testing_10nth_value_of_view
SELECT * FROM fibonacci LIMIT 1 OFFSET 10;


CREATE TEMPORARY TABLE test_table (a integer) STRICT;

Then we preprocess the script :

import addressable_sql_queries
with (open("raw_script.sql") as input_file,
    open("preprocessed_script.py", "w") as output_file):
    output_file.write(
        addressable_sql_queries.preprocess_to_str(input_file.read()))

This step can also be done with :

python -m addressable_sql_queries path/to/raw_script.sql -o path/to/preprocessed_script.py

As all keys in the example above are not only valid but usable python ids, you can then access chunks of this script like this :

from preprocessed_script import *
print(contiguous_view_tests)

Which will outputs :

 -- % contiguous_view_tests
SELECT * FROM fibonacci LIMIT 1 OFFSET 3;
SELECT * FROM fibonacci LIMIT 1 OFFSET 4;
SELECT * FROM fibonacci LIMIT 1 OFFSET 5;

Even when keys are invalid ids, you can access the chunks of the script by these means :

from preprocessed_script import queries as sql_queries
print(sql_queries[0]) # This will print the chunk before the first delimiter, which is nothing in this case : "\n".
print(sql_queries[None]) # Another way to do the same thing. None is always the first key.
print(sql_queries["fibonacci_view_creation"])
"""This will print :
 -- % fibonacci_view_creation
CREATE TEMPORARY VIEW fibonacci (a, index_) AS
WITH RECURSIVE inner_fibo(b, c, index_) AS (
    SELECT 0, 1, 0
    UNION
    SELECT c, c + b, index_ + 1
    FROM inner_fibo
)
SELECT b, index_ FROM inner_fibo;


"""
print(sql_queries[1]) # This will print the same thing as above (the second chunk).
print(sql_queries.having_line(4)) # This will print the chunk containing the line 4 (counting from 1), and thus does the same thing as above.

Parser mode example :

Alternatively, parser mode can be used :

from addressable_sql_queries import Query
q = Query.fromFile("raw_script.sql")
print(q[3])
"""This will print :
 -- % testing_10nth_value_of_view
SELECT * FROM fibonacci LIMIT 1 OFFSET 10;


CREATE TEMPORARY TABLE test_table (a integer) STRICT;
"""

Query object can also be built directly from a string.

Note : in the case where the first line is a delimiter, thus making the first and second chunk shares the first line (starting at 1), the having_line function will return the second, non empty chunk.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

addressable_sql_queries-0.0.1.dev1.tar.gz (12.7 kB view details)

Uploaded Source

Built Distribution

File details

Details for the file addressable_sql_queries-0.0.1.dev1.tar.gz.

File metadata

File hashes

Hashes for addressable_sql_queries-0.0.1.dev1.tar.gz
Algorithm Hash digest
SHA256 3d6784c6c06f1261f63925328048d990ed19858333dc905cc89782360de7da86
MD5 d1abde7c61c832aea446be4daf569560
BLAKE2b-256 cc5f9b25d8976f10bc8ea0f82521df691bb3c23b05f8f729c8713cf5372d2300

See more details on using hashes here.

File details

Details for the file addressable_sql_queries-0.0.1.dev1-py3-none-any.whl.

File metadata

File hashes

Hashes for addressable_sql_queries-0.0.1.dev1-py3-none-any.whl
Algorithm Hash digest
SHA256 501202d2a7cbcdc3f3e888b63695ec129794c55de24ab26ae33bafd56790ce8f
MD5 3b620ad3089367133f0cd947414b3e3f
BLAKE2b-256 e2fb5b9fa74b4fa65b49967cb334cf699c849168e9d6e3684da709b4023c9855

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page