A supercharged SQLite library for Python

Overview
supersqlite

SuperSQLite: a supercharged SQLite library for Python

pipeline status   Build Status   Build status
PyPI version   license   Python version

A feature-packed Python package and for utilizing SQLite in Python by Plasticity. It is intended to be a drop-in replacement to Python's built-in SQLite API, but without any limitations. It offers unique features like remote streaming over HTTP and bundling of extensions like JSON, R-Trees (geospatial indexing), and Full Text Search. SuperSQLite is also packaged with pre-compiled native binaries for SQLite and all of its extensions for nearly every platform as to avoid any C/C++ compiler errors during install.

Table of Contents

Installation

You can install this package with pip:

pip install supersqlite # Python 2.7
pip3 install supersqlite # Python 3

Motivation

SQLite, is a fast, popular embedded database, used by large enterprises. It is the most widely-deployed database and has billions of deployments. It has a built-in binding in Python.

The Python bindings, however, often are compiled against an out-of-date copy of SQLite or may be compiled with limitations set to low levels. Moreover, it is difficult to load extremely useful extensions like JSON1 that adds JSON functionality to SQLite or FTS5 that adds full-text search functionality to SQLite since they must be compiled with a C/C++ compiler on each platform before being loaded.

SuperSQLite aims to solve these problems by packaging a newer version of SQLite natively pre-compiled for every platform along with natively pre-compiled SQLite extensions. SuperSQLite also adds useful unique new features like remote streaming over HTTP to read from a centralized SQLite database.

Moreover, by default, SQLite does not enable some optimizations that can result in speedups. SuperSQLite compiles SQLite with various optimizations and allows you to select your workload at runtime to further automatically configure the connection to be optimized for your workload.

When to use SuperSQLite?

SQLite is extremely reliable and durable for large amounts of data (up to 140TB). It is considered one of the most well-engineered and well-tested software solutions today, with 711x more test code than implementation code.

SQLite is faster than nearly every other database at read-heavy use cases (especially compared to databases that may use a client-server model with network latency like MySQL, PostgreSQL, MongoDB, DynamoDB, etc.). You can also instantiate SQLite completely in-memory to remove disk latency, if your data will fit within RAM. For key/value use cases, you can get comparable or better read/write performance to key/value databases like LevelDB with the LSM1 extension.

When you have a write-heavy workload with multiple servers that need to write concurrently to a shared database (backend to a website), you would probably want to choose something that has a client-server model instead like PostgreSQL, although SQLite can handle processing write requests fast enough that it is sufficient for most concurrent write loads. In fact, Expensify uses SQLite for their entire backend. If you need the database to be automatically replicated or automatically sharded across machines or other distributed features, you probably want to use something else.

See Appropriate Uses For SQLite for more information and Well-Known Users of SQLite for example use cases.

Using the Library

Instead of 'import sqlite3', use:

from supersqlite import sqlite3

This retains compatibility with the sqlite3 package, while adding the various enhancements.

Connecting

Given the above import, connect to a sqlite database file using:

conn = sqlite3.connect('foo.db')

Querying

Remote Streaming over HTTP

Workload Optimizations

Extensions

JSON1

FTS3, FTS4, FTS5

LSM1

R*Tree

Other

Custom

Export SQLite Resources

Optimizations

Other Documentation

SuperSQLite extends the apsw Python SQLite wrapper and adds on to its functionality. You can find the full documentation for that library here, which in turn attempts to implement PEP 249 (DB API). The connection object, cursor object, etc. are all apsw.Connection, apsw.Cursor. Note, however, that some monkey-patching has been done to make the library more in-line and compatible as a drop-in replacement for Python's built-in sqlite3 module.

Other documentation is not available at this time. See the source file directly (it is well commented) if you need more information about a method's arguments or want to see all supported features.

Other Programming Languages

Currently, this library only supports Python. There are no plans to port it to any other languages, but since SQLite has a native C implementation and has bindings in most languages, you can use the export functions to load SuperSQLite's SQLite extensions in the SQLite bindings of other programming languages or link SuperSQLite's version of SQLite to a native binary.

Contributing

The main repository for this project can be found on GitLab. The GitHub repository is only a mirror. Pull requests for more tests, better error-checking, bug fixes, performance improvements, or documentation or adding additional utilties / functionalities are welcome on GitLab.

You can contact us at [email protected].

Roadmap

  • Out of the box, "fast-write" configuration option that makes the connection optimized for fast-writing.
  • Out of the box, "fast-read" configuration option that makes the conenction optimized for fast-reading.
  • Optimize streaming cache behavior

Other Notable Projects

  • pysqlite - The built-in sqlite3 module in Python.
  • apsw - Powers the main API of SuperSQLite, aims to port all of SQLite's API functionality (like VFSes) to Python, not just the query APIs.
  • Magnitude - Another project by Plasticity that uses SuperSQLite's unique features for machine learning embedding models.

LICENSE and Attribution

This repository is licensed under the license found here.

The SQLite "feather" icon is taken from the SQLite project which is released as public domain.

This project is not affiliated with the official SQLite project.

Comments
  • Missing __enter__() with cursor

    Missing __enter__() with cursor

    The syntax : with conn.cursor() as cursor: ... work with standard Python SQLite and others database drivers (postgres, ...) But the method __enter__() is not defined in supersqlite driver.

    opened by pprados 0
  • AttributeError: 'sqlite3.Connection' object has no attribute 'enable_load_extension'

    AttributeError: 'sqlite3.Connection' object has no attribute 'enable_load_extension'

    Is supersqlite enable loading sqlite extensions? What can cause this error:

    from supersqlite import sqlite3 as sqlite33 conn33=sqlite33.connect("mydbfile.db") conn33.enable_load_extension(True) Traceback (most recent call last): File "", line 1, in AttributeError: 'sqlite3.Connection' object has no attribute 'enable_load_extension' thank you.

    opened by dbricker-intel 0
  • Publish supersqlite on conda-forge

    Publish supersqlite on conda-forge

    It would be very convenient to have this library available on conda-forge so it could be installed with the Conda package manager, which is ideal for packages with binary dependencies. Is that a possibility?

    opened by JWCook 0
  • No module named 'supersqlite.third_party.internal.apsw'

    No module named 'supersqlite.third_party.internal.apsw'

    Hello, I try to install supersqlite from pip and conda. I can use

    docker run -it ubuntu
    # then
    apt-get update ; \
    apt-get install -y python-apsw python3 python3-pip ; \
    pip3 install supersqlite ; python3 -c "import supersqlite"
    

    It's correct.

    Now, I try with conda

    docker run -it conda/miniconda3
    # Then
    conda update conda -y ; \
    conda init bash ;
    exec bash
    # and
    conda install -c conda-forge apsw -y ; \
    pip3 install supersqlite ; \
    python3 -c "import supersqlite"
    

    I receive and error: ModuleNotFoundError: No module named 'supersqlite.third_party.internal.apsw'

    Collecting supersqlite
      Downloading supersqlite-0.0.78.tar.gz (25.8 MB)
         |████████████████████████████████| 25.8 MB 3.9 MB/s 
    Building wheels for collected packages: supersqlite
      Building wheel for supersqlite (setup.py) ... done
      Created wheel for supersqlite: filename=supersqlite-0.0.78-cp39-cp39-linux_x86_64.whl size=71094064 sha256=64d23d0848fba148a4506b0905135d23df4d7099660bbba683584b71623d38a2
      Stored in directory: /root/.cache/pip/wheels/c2/83/40/cffebda33928fae730f81985e5d75078d257db3586bd419905
    Successfully built supersqlite
    Installing collected packages: supersqlite
    Successfully installed supersqlite-0.0.78
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/usr/local/lib/python3.9/site-packages/supersqlite/__init__.py", line 47, in <module>
        import supersqlite.third_party.internal.apsw as apsw
    ModuleNotFoundError: No module named 'supersqlite.third_party.internal.apsw'
    

    You can reproduce this bug with this docker file

    # SuperSqliteDockerfile file
    FROM continuumio/anaconda3
    
    RUN conda create --name testSupersqlite python=3.7 ; \
        conda activate testSupersqlite ; \
        pip3 install supersqlite
    
    ENTRYPOINT python -c "import supersqlite"
    

    and

    docker run --rm -it $(docker build -q -f SuperSqliteDockerfile .)
    

    How can I resolve this problem?

    Thanks

    opened by pprados 1
  • Fix typo that causes install to break

    Fix typo that causes install to break

    pip install of supersqlite is broken due to a typo in a requirement name: lsb-db should actually be lsm-db.

    This also resolves https://github.com/plasticityai/supersqlite/issues/5

    opened by DDevine 2
  • [BUG] Outdated/typo in requirements.txt

    [BUG] Outdated/typo in requirements.txt

    Description

    It seems current requirements.txt is either outdated or contains a typo in https://github.com/plasticityai/supersqlite/blob/d74da749c6fa5df021df3968b854b9a59f829e17/requirements.txt#L1 When trying to pip install lsb-db==0.6.4 I get following error

    Could not find a version that satisfies the requirement lsb-db==0.6.4 (from versions: none)
    

    I guess this could be a typo for lsm-db?

    Expected behavior

    Installing this package via pip won't fail

    System

    Ubuntu 18.04LTS / Python 3.6 / pip 19.1.1

    cc @AjayP13

    opened by johnygomez 0
Releases(0.0.78)
Owner
Plasticity
The official GitHub account of Plasticity
Plasticity
Redis Python Client

redis-py The Python interface to the Redis key-value store. Python 2 Compatibility Note redis-py 3.5.x will be the last version of redis-py that suppo

Andy McCurdy 11k Dec 29, 2022
Prometheus instrumentation library for Python applications

Prometheus Python Client The official Python 2 and 3 client for Prometheus. Three Step Demo One: Install the client: pip install prometheus-client Tw

Prometheus 3.2k Jan 07, 2023
PyRemoteSQL is a python SQL client that allows you to connect to your remote server with phpMyAdmin installed.

PyRemoteSQL Python MySQL remote client Basically this is a python SQL client that allows you to connect to your remote server with phpMyAdmin installe

ProbablyX 3 Nov 04, 2022
Py2neo is a client library and toolkit for working with Neo4j from within Python

Py2neo Py2neo is a client library and toolkit for working with Neo4j from within Python applications. The library supports both Bolt and HTTP and prov

py2neo.org 1.2k Jan 02, 2023
A CRUD and REST api with mongodb atlas.

Movies_api A CRUD and REST api with mongodb atlas. Setup First import all the python dependencies in your virtual environment or globally by the follo

Pratyush Kongalla 0 Nov 09, 2022
Import entity definition document into SQLie3. Manage the entity. Also, create a "Create Table SQL file".

EntityDocumentMaker Version 1.00 After importing the entity definition (Excel file), store the data in sqlite3. エンティティ定義(Excelファイル)をインポートした後、データをsqlit

G-jon FujiYama 1 Jan 09, 2022
Pandas Google BigQuery

pandas-gbq pandas-gbq is a package providing an interface to the Google BigQuery API from pandas Installation Install latest release version via conda

Python for Data 345 Dec 28, 2022
Pony Object Relational Mapper

Downloads Pony Object-Relational Mapper Pony is an advanced object-relational mapper. The most interesting feature of Pony is its ability to write que

3.1k Jan 04, 2023
Pandas on AWS - Easy integration with Athena, Glue, Redshift, Timestream, QuickSight, Chime, CloudWatchLogs, DynamoDB, EMR, SecretManager, PostgreSQL, MySQL, SQLServer and S3 (Parquet, CSV, JSON and EXCEL).

AWS Data Wrangler Pandas on AWS Easy integration with Athena, Glue, Redshift, Timestream, QuickSight, Chime, CloudWatchLogs, DynamoDB, EMR, SecretMana

Amazon Web Services - Labs 3.3k Dec 31, 2022
Query multiple mongoDB database collections easily

leakscoop Perform queries across multiple MongoDB databases and collections, where the field names and the field content structure in each database ma

bagel 5 Jun 24, 2021
Baserow is an open source no-code database tool and Airtable alternative

Baserow is an open source no-code database tool and Airtable alternative

1.3k Jan 01, 2023
Redis client for Python asyncio (PEP 3156)

Redis client for Python asyncio. Redis client for the PEP 3156 Python event loop. This Redis library is a completely asynchronous, non-blocking client

Jonathan Slenders 554 Dec 04, 2022
ClickHouse Python Driver with native interface support

ClickHouse Python Driver ClickHouse Python Driver with native (TCP) interface support. Asynchronous wrapper is available here: https://github.com/myma

Marilyn System 957 Dec 30, 2022
A simple python package that perform SQL Server Source Control and Auto Deployment.

deploydb Deploy your database objects automatically when the git branch is updated. Production-ready! ⚙️ Easy-to-use 🔨 Customizable 🔧 Installation I

Mert Güvençli 10 Dec 07, 2022
A library for python made by me,to make the use of MySQL easier and more pythonic

my_ezql A library for python made by me,to make the use of MySQL easier and more pythonic This library was made by Tony Hasson , a 25 year old student

3 Nov 19, 2021
A Python library for Cloudant and CouchDB

Cloudant Python Client This is the official Cloudant library for Python. Installation and Usage Getting Started API Reference Related Documentation De

Cloudant 162 Dec 19, 2022
AWS SDK for Python

Boto3 - The AWS SDK for Python Boto3 is the Amazon Web Services (AWS) Software Development Kit (SDK) for Python, which allows Python developers to wri

the boto project 7.8k Jan 04, 2023
Simple Python demo app that connects to an Oracle DB.

Cloud Foundry Sample Python Application Connecting to Oracle Simple Python demo app that connects to an Oracle DB. The app is based on the example pro

Daniel Buchko 1 Jan 10, 2022
Py2neo is a comprehensive toolkit for working with Neo4j from within Python applications or from the command line.

Py2neo Py2neo is a client library and toolkit for working with Neo4j from within Python applications and from the command line. The library supports b

Nigel Small 1.2k Jan 02, 2023
PostgreSQL database access simplified

Queries: PostgreSQL Simplified Queries is a BSD licensed opinionated wrapper of the psycopg2 library for interacting with PostgreSQL. The popular psyc

Gavin M. Roy 251 Oct 25, 2022