https://github.com/gizmodata/sqlalchemy-gizmosql-adbc-dialect
A SQLFlite ADBC Dialect for SQLAlchemy
https://github.com/gizmodata/sqlalchemy-gizmosql-adbc-dialect
Last synced: 6 months ago
JSON representation
A SQLFlite ADBC Dialect for SQLAlchemy
- Host: GitHub
- URL: https://github.com/gizmodata/sqlalchemy-gizmosql-adbc-dialect
- Owner: gizmodata
- License: mit
- Created: 2024-06-27T20:44:22.000Z (11 months ago)
- Default Branch: main
- Last Pushed: 2024-11-19T15:42:59.000Z (6 months ago)
- Last Synced: 2024-11-19T16:41:07.460Z (6 months ago)
- Language: Python
- Homepage:
- Size: 77.1 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# SQLAlchemy [GizmoSQL](https://github.com/gizmodata/GizmoSQL) ADBC Dialect
[
](https://github.com/gizmodata/sqlalchemy-gizmosql-adbc-dialect)
[](https://github.com/gizmodata/sqlalchemy-gizmosql-adbc-dialect/actions/workflows/ci.yml)
[](https://pypi.org/project/sqlalchemy-gizmosql-adbc-dialect/)
[](https://badge.fury.io/py/sqlalchemy-gizmosql-adbc-dialect)
[](https://pypi.org/project/sqlalchemy-gizmosql-adbc-dialect/)Basic SQLAlchemy dialect for [GizmoSQL](https://github.com/gizmodata/GizmoSQL)
## Installation
### Option 1 - from PyPi
```sh
$ pip install sqlalchemy-gizmosql-adbc-dialect
```### Option 2 - from source - for development
```shell
git clone https://github.com/gizmodata/sqlalchemy-gizmosql-adbc-dialectcd sqlalchemy-gizmosql-adbc-dialect
# Create the virtual environment
python3 -m venv .venv# Activate the virtual environment
. .venv/bin/activate# Upgrade pip, setuptools, and wheel
pip install --upgrade pip setuptools wheel# Install SQLAlchemy GizmoSQL ADBC Dialect - in editable mode with dev dependencies
pip install --editable .[dev]
```### Note
For the following commands - if you are running from source and using `--editable` mode (for development purposes) - you will need to set the PYTHONPATH environment variable as follows:
```shell
export PYTHONPATH=$(pwd)/src
```## Usage
Once you've installed this package, you should be able to just use it, as SQLAlchemy does a python path search
### Start a GizmoSQL Server - example below - see https://github.com/gizmodata/GizmoSQL for more details
```bash
docker run --name gizmosql \
--detach \
--rm \
--tty \
--init \
--publish 31337:31337 \
--env TLS_ENABLED="1" \
--env GIZMOSQL_PASSWORD="gizmosql_password" \
--env PRINT_QUERIES="1" \
--pull missing \
gizmodata/gizmosql:latest
```### Connect with the SQLAlchemy GizmoSQL ADBC Dialect
```python
import os
import loggingfrom sqlalchemy import create_engine, MetaData, Table, select, Column, text, Integer, String, Sequence
from sqlalchemy.orm import Session
from sqlalchemy.orm import declarative_base
from sqlalchemy.engine.url import URL# Setup logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)Base = declarative_base()
class FakeModel(Base): # type: ignore
__tablename__ = "fake"id = Column(Integer, Sequence("fakemodel_id_sequence"), primary_key=True)
name = Column(String)def main():
# Build the URL
url = URL.create(drivername="gizmosql",
host="localhost",
port=31337,
username=os.getenv("GIZMOSQL_USERNAME", "gizmosql_username"),
password=os.getenv("GIZMOSQL_PASSWORD", "gizmosql_password"),
query={"disableCertificateVerification": "True",
"useEncryption": "True"
}
)print(f"Database URL: {url}")
engine = create_engine(url=url)
Base.metadata.create_all(bind=engine)metadata = MetaData()
metadata.reflect(bind=engine)for table_name in metadata.tables:
print(f"Table name: {table_name}")with Session(bind=engine) as session:
# Try ORM
session.add(FakeModel(id=1, name="Joe"))
session.commit()joe = session.query(FakeModel).filter(FakeModel.name == "Joe").first()
assert joe.name == "Joe"
# Execute some raw SQL
results = session.execute(statement=text("SELECT * FROM fake")).fetchall()
print(results)# Try a SQLAlchemy table select
fake: Table = metadata.tables["fake"]
stmt = select(fake.c.name)results = session.execute(statement=stmt).fetchall()
print(results)if __name__ == "__main__":
main()
```### Credits
Much code and inspiration was taken from repo: https://github.com/Mause/duckdb_engine