<p align="center">
<img width="761" alt="SQLAlchemy and Firebolt" src="https://user-images.githubusercontent.com/7674553/145249436-534b3cc0-2350-4f7e-9c56-78ffbcc0f003.png">
</p>
# firebolt-sqlalchemy
[![Unit tests](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/unit-tests.yml/badge.svg)](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/unit-tests.yml)
[![Code quality checks](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/code-check.yml/badge.svg)](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/code-check.yml)
[![Firebolt Security Scan](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/security-scan.yml/badge.svg)](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/security-scan.yml)
[![Integration tests](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/python-integration-tests.yml/badge.svg)](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/python-integration-tests.yml)
![Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/ptiurin/64f31d124b7249319234d247ade4a7db/raw/firebolt-sqlalchemy-coverage.json)
The [Firebolt](https://www.firebolt.io/) dialect for [SQLAlchemy](https://www.sqlalchemy.org/). `firebolt-sqlalchemy` uses [Firebolt's Python SDK](https://github.com/firebolt-db/firebolt-python-sdk) which implements [PEP 249](https://www.python.org/dev/peps/pep-0249/).
* [SQLAlchemy Dialects](https://docs.sqlalchemy.org/en/20/dialects/index.html#external-dialects)
* [PyPI Package](https://pypi.org/project/firebolt-sqlalchemy/)
## Installation
Requires Python >=3.7.
```bash
pip install firebolt-sqlalchemy
```
## Connecting
Connection strings use the following structure:
```
firebolt://{client_id}:{client_secret}@{database}[/{engine_name}]?account_name={name}
```
`engine_name` is optional.
`account_name` is required.
Examples:
```
firebolt://aaa-bbb-ccc-222:$ecret@sample_database?account_name=my_account
firebolt://aaa-bbb-ccc-222:$ecret@sample_database/sample_engine?account_name=my_account
```
To override the API URL (e.g. for dev testing):
```bash
export FIREBOLT_BASE_URL=<your_url>
```
If your secret contains % or / characters they need to be sanitised as per https://docs.sqlalchemy.org/en/20/core/engines.html#database-urls
```python
my_secret = "0920%/2"
import urllib.parse
new_secret = urllib.parse.quote_plus(my_secret)
```
## Quick Start
```python
import urllib.parse
from sqlalchemy import create_engine
secret = urllib.parse.quote_plus("your_secret_here")
engine = create_engine("firebolt://aaa-bbb-ccc-222:" + secret + "@sample_database/sample_engine?account_name=my_account")
connection = engine.connect()
connection.execute("CREATE FACT TABLE example(dummy int) PRIMARY INDEX dummy")
connection.execute("INSERT INTO example(dummy) VALUES (11)")
result = connection.execute("SELECT * FROM example")
for item in result.fetchall():
print(item)
```
### [AsyncIO](https://docs.sqlalchemy.org/en/20/orm/extensions/asyncio.html) extension
```python
import urllib.parse
from sqlalchemy import text
from sqlalchemy.ext.asyncio import create_async_engine
secret = urllib.parse.quote_plus("your_secret_here")
engine = create_async_engine("asyncio+firebolt://aaa-bbb-ccc-222:" + secret + "@sample_database/sample_engine?account_name=my_account")
async with engine.connect() as conn:
await conn.execute(
text(f"INSERT INTO example(dummy) VALUES (11)")
)
result = await conn.execute(
text(f"SELECT * FROM example")
)
print(result.fetchall())
await engine.dispose()
```
## Limitations
1. Transactions are not supported since Firebolt database does not support them at this time.
1. Parametrised calls to execute and executemany are not implemented.
## Contributing
See: [CONTRIBUTING.MD](https://github.com/firebolt-db/firebolt-sqlalchemy/tree/master/CONTRIBUTING.MD)
Raw data
{
"_id": null,
"home_page": "https://github.com/firebolt-db/firebolt-sqlalchemy",
"name": "firebolt-sqlalchemy",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": null,
"author": "Firebolt",
"author_email": "pypi@firebolt.io",
"download_url": "https://files.pythonhosted.org/packages/48/d2/8763dddf8306bbeae8abc924af670238f4b939dce778ddb683f0fdfe02fb/firebolt_sqlalchemy-1.0.2.tar.gz",
"platform": null,
"description": "<p align=\"center\">\n <img width=\"761\" alt=\"SQLAlchemy and Firebolt\" src=\"https://user-images.githubusercontent.com/7674553/145249436-534b3cc0-2350-4f7e-9c56-78ffbcc0f003.png\">\n</p>\n\n# firebolt-sqlalchemy\n\n[![Unit tests](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/unit-tests.yml/badge.svg)](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/unit-tests.yml)\n[![Code quality checks](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/code-check.yml/badge.svg)](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/code-check.yml)\n[![Firebolt Security Scan](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/security-scan.yml/badge.svg)](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/security-scan.yml)\n[![Integration tests](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/python-integration-tests.yml/badge.svg)](https://github.com/firebolt-db/firebolt-sqlalchemy/actions/workflows/python-integration-tests.yml)\n![Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/ptiurin/64f31d124b7249319234d247ade4a7db/raw/firebolt-sqlalchemy-coverage.json)\n\n\n\nThe [Firebolt](https://www.firebolt.io/) dialect for [SQLAlchemy](https://www.sqlalchemy.org/). `firebolt-sqlalchemy` uses [Firebolt's Python SDK](https://github.com/firebolt-db/firebolt-python-sdk) which implements [PEP 249](https://www.python.org/dev/peps/pep-0249/).\n\n* [SQLAlchemy Dialects](https://docs.sqlalchemy.org/en/20/dialects/index.html#external-dialects)\n* [PyPI Package](https://pypi.org/project/firebolt-sqlalchemy/)\n\n## Installation\n\nRequires Python >=3.7.\n\n```bash\npip install firebolt-sqlalchemy\n```\n\n## Connecting\n\nConnection strings use the following structure:\n\n```\nfirebolt://{client_id}:{client_secret}@{database}[/{engine_name}]?account_name={name}\n```\n\n`engine_name` is optional.\n\n`account_name` is required.\n\nExamples:\n\n```\nfirebolt://aaa-bbb-ccc-222:$ecret@sample_database?account_name=my_account\nfirebolt://aaa-bbb-ccc-222:$ecret@sample_database/sample_engine?account_name=my_account\n```\n\nTo override the API URL (e.g. for dev testing):\n\n```bash\nexport FIREBOLT_BASE_URL=<your_url>\n```\n\nIf your secret contains % or / characters they need to be sanitised as per https://docs.sqlalchemy.org/en/20/core/engines.html#database-urls\n```python\nmy_secret = \"0920%/2\"\nimport urllib.parse\nnew_secret = urllib.parse.quote_plus(my_secret)\n```\n\n## Quick Start\n\n```python\nimport urllib.parse\nfrom sqlalchemy import create_engine\n\nsecret = urllib.parse.quote_plus(\"your_secret_here\")\nengine = create_engine(\"firebolt://aaa-bbb-ccc-222:\" + secret + \"@sample_database/sample_engine?account_name=my_account\")\nconnection = engine.connect()\n\nconnection.execute(\"CREATE FACT TABLE example(dummy int) PRIMARY INDEX dummy\")\nconnection.execute(\"INSERT INTO example(dummy) VALUES (11)\")\nresult = connection.execute(\"SELECT * FROM example\")\nfor item in result.fetchall():\n print(item)\n```\n\n### [AsyncIO](https://docs.sqlalchemy.org/en/20/orm/extensions/asyncio.html) extension\n\n```python\nimport urllib.parse\nfrom sqlalchemy import text\nfrom sqlalchemy.ext.asyncio import create_async_engine\n\nsecret = urllib.parse.quote_plus(\"your_secret_here\")\nengine = create_async_engine(\"asyncio+firebolt://aaa-bbb-ccc-222:\" + secret + \"@sample_database/sample_engine?account_name=my_account\")\n\nasync with engine.connect() as conn:\n\n await conn.execute(\n text(f\"INSERT INTO example(dummy) VALUES (11)\")\n )\n\n result = await conn.execute(\n text(f\"SELECT * FROM example\")\n )\n print(result.fetchall())\n\nawait engine.dispose()\n```\n\n\n## Limitations\n\n1. Transactions are not supported since Firebolt database does not support them at this time.\n1. Parametrised calls to execute and executemany are not implemented.\n\n## Contributing\n\nSee: [CONTRIBUTING.MD](https://github.com/firebolt-db/firebolt-sqlalchemy/tree/master/CONTRIBUTING.MD)\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "Sqlalchemy adapter for Firebolt",
"version": "1.0.2",
"project_urls": {
"Bug Tracker": "https://github.com/firebolt-db/firebolt-sqlalchemy",
"Download": "https://github.com/firebolt-db/firebolt-sqlalchemy/archive/refs/tags/0.0.9.tar.gz",
"Homepage": "https://github.com/firebolt-db/firebolt-sqlalchemy"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "bcd21b867fac57a763b95e1f533288df19e5788f1cc6b5fc45baa314e61cfce0",
"md5": "b6323487971b084caaaf364cbdf8cf7b",
"sha256": "92e7f3266ad6cb589e1b0326f5466891c8217bfda3ab640715efdc14f50551f5"
},
"downloads": -1,
"filename": "firebolt_sqlalchemy-1.0.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "b6323487971b084caaaf364cbdf8cf7b",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 12487,
"upload_time": "2024-04-24T17:07:24",
"upload_time_iso_8601": "2024-04-24T17:07:24.039199Z",
"url": "https://files.pythonhosted.org/packages/bc/d2/1b867fac57a763b95e1f533288df19e5788f1cc6b5fc45baa314e61cfce0/firebolt_sqlalchemy-1.0.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "48d28763dddf8306bbeae8abc924af670238f4b939dce778ddb683f0fdfe02fb",
"md5": "8c8fdbd770960b25bd20c298014fcf8f",
"sha256": "fe64c37e13dd8dc408908995371e2cbb34b5afae6d5a7a212cbc248db81d43fd"
},
"downloads": -1,
"filename": "firebolt_sqlalchemy-1.0.2.tar.gz",
"has_sig": false,
"md5_digest": "8c8fdbd770960b25bd20c298014fcf8f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 11704,
"upload_time": "2024-04-24T17:07:25",
"upload_time_iso_8601": "2024-04-24T17:07:25.787469Z",
"url": "https://files.pythonhosted.org/packages/48/d2/8763dddf8306bbeae8abc924af670238f4b939dce778ddb683f0fdfe02fb/firebolt_sqlalchemy-1.0.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-04-24 17:07:25",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "firebolt-db",
"github_project": "firebolt-sqlalchemy",
"travis_ci": false,
"coveralls": true,
"github_actions": true,
"lcname": "firebolt-sqlalchemy"
}