py-data-api is a user-friendly client for AWS Postgres Aurora Serverless Data API
Project description
py-data-api - Data API Client for Python
py-data-api is a user-friendly client which supports SQLAlchemy models. Also, the package includes DB API 2.0 Client and SQLAlchemy Dialects.
Features
- A user-friendly client which supports SQLAlchemy models
- SQLAlchemy Dialects (experimental)
- DB API 2.0 compatible client PEP 249
What's AWS Aurora Serverless's Data API?
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html
This project is an experimental phase.
Warning: Some interface will be changed.
How to install
pydataapi requires Python 3.6.1 or later
$ pip install pydataapi
Example
from typing import List
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Query
from sqlalchemy.sql import Insert
from pydataapipostgres import DataAPI, transaction, Result, Record
class Pets(declarative_base()):
__tablename__ = 'pets'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(255, collation='utf8_unicode_ci'), default=None)
database: str = 'test'
resource_arn: str = 'arn:aws:rds:us-east-1:123456789012:cluster:serverless-test-1'
secret_arn: str = 'arn:aws:secretsmanager:us-east-1:123456789012:secret:serverless-test1'
def example_with_statement():
# DataAPI supports with statement for handling transaction
with DataAPI(database=database, resource_arn=resource_arn, secret_arn=secret_arn) as data_api:
# start transaction
insert: Insert = Insert(Pets, {'name': 'dog'})
# INSERT INTO pets (name) VALUES ('dog')
# `execute` accepts SQL statement as str or SQL Alchemy SQL objects
result: Result = data_api.execute(insert)
print(result.number_of_records_updated)
# 1
query = Query(Pets).filter(Pets.id == 1)
result: Result = data_api.execute(query) # or data_api.execute('select id, name from pets')
# SELECT pets.id, pets.name FROM pets WHERE pets.id = 1
# `Result` like a Result object in SQL Alchemy
print(result.scalar())
# 1
print(result.one())
# [Record<id=1, name='dog'>]
# `Result` is Sequence[Record]
records: List[Record] = list(result)
print(records)
# [Record<id=1, name='dog'>]
# Record is Sequence and Iterator
record = records[0]
print(record[0])
# 1
print(record[1])
# dog
for column in record:
print(column)
# 1 ...
# show record as dict()
print(record.dict())
# {'id': 1, 'name': 'dog'}
# batch insert
insert: Insert = Insert(Pets)
data_api.batch_execute(insert, [
{'id': 2, 'name': 'cat'},
{'id': 3, 'name': 'snake'},
{'id': 4, 'name': 'rabbit'},
])
result = data_api.execute('select * from pets')
print(list(result))
# [Record<id=1, name='dog'>, Record<id=2, name='cat'>, Record<id=3, name='snake'>, Record<id=4, name='rabbit'>]
# result is a sequence object
for record in result:
print(record)
# Record<id=1, name='dog'> ...
# commit
def example_decorator():
pet_names: List[str] = ['dog', 'cat', 'snake']
add_pets(pet_names)
@transaction(database=database, resource_arn=resource_arn, secret_arn=secret_arn)
def add_pets(data_api: DataAPI, pet_names: List[str]) -> None:
# start transaction
for pet_name in pet_names:
data_api.execute(Insert(Pets, {'name': pet_name}))
# some logic ...
# commit
def example_simple_execute():
data_api = DataAPI(resource_arn, secret_arn, database=database)
result: Result = data_api.execute('show tables')
print(result.scalar())
# Pets
def example_rollback():
with DataAPI(resource_arn, secret_arn) as data_api:
data_api.execute(Insert(Pets, {'name': 'dog'}))
# you can rollback by Exception
raise Exception
def example_rollback_with_custom_exception():
class OriginalError(Exception):
pass
with DataAPI(resource_arn, secret_arn, rollback_exception=OriginalError) as data_api:
data_api.execute(Insert(Pets, {'name': 'dog'}))
# some logic ...
# rollback when happen `rollback_exception`
raise OriginalError # rollback
# raise Exception <- DataAPI don't rollback
def example_driver_for_sqlalchemy():
from sqlalchemy.engine import create_engine
engine = create_engine(
'mysql+pydataapi://',
connect_args={
'resource_arn': 'arn:aws:rds:us-east-1:123456789012:cluster:dummy',
'secret_arn': 'arn:aws:secretsmanager:us-east-1:123456789012:secret:dummy',
'database': 'test'}
)
result: ResultProxy = engine.execute("select * from pets")
print(result.fetchall())
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pydataapi_postgres-0.1.3.tar.gz.
File metadata
- Download URL: pydataapi_postgres-0.1.3.tar.gz
- Upload date:
- Size: 13.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.6.0 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2fbb550659b4d4b63bcd10326e9d2decc99b0b39b86c8feb73170e523c3bff7
|
|
| MD5 |
d7ce146fdbabdd216f1828debc1b78a8
|
|
| BLAKE2b-256 |
622932e4d1c3958c0411364c01aac41da012258e0c0fe80c49227363c5fd6a4c
|
File details
Details for the file pydataapi_postgres-0.1.3-py3-none-any.whl.
File metadata
- Download URL: pydataapi_postgres-0.1.3-py3-none-any.whl
- Upload date:
- Size: 20.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.6.0 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4e73e01ee2bb51e31dec1c1e422b628098ebcc86550b38b0b1e942855382db82
|
|
| MD5 |
c7c97be2dda0d3d9745ca907f299a361
|
|
| BLAKE2b-256 |
605125248ed31ae72a6314b5339a6ddc1fe99907de9e27ed3ba9f1a900aa3a2f
|