{ "info": { "author": "Lofton Harmon", "author_email": "lofton.harmon@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# py-data-api - Data API Client for Python\n\npy-data-api is a user-friendly client which supports SQLAlchemy models.\nAlso, the package includes DB API 2.0 Client and SQLAlchemy Dialects.\n\n## Features\n- A user-friendly client which supports SQLAlchemy models\n- SQLAlchemy Dialects (experimental)\n- DB API 2.0 compatible client [PEP 249](https://www.python.org/dev/peps/pep-0249/)\n\n## What's AWS Aurora Serverless's Data API?\nhttps://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html\n\n## This project is an experimental phase.\nWarning: Some interface will be changed.\n\n## How to install\npydataapi requires Python 3.6.1 or later \n```bash\n$ pip install pydataapi\n```\n\n## Example\n\n```python\nfrom typing import List\n\nfrom sqlalchemy import Column, Integer, String\nfrom sqlalchemy.ext.declarative import declarative_base\nfrom sqlalchemy.orm import Query\nfrom sqlalchemy.sql import Insert\n\nfrom pydataapipostgres import DataAPI, transaction, Result, Record\n\n\nclass Pets(declarative_base()):\n __tablename__ = 'pets'\n id = Column(Integer, primary_key=True, autoincrement=True)\n name = Column(String(255, collation='utf8_unicode_ci'), default=None)\n\n\ndatabase: str = 'test'\nresource_arn: str = 'arn:aws:rds:us-east-1:123456789012:cluster:serverless-test-1'\nsecret_arn: str = 'arn:aws:secretsmanager:us-east-1:123456789012:secret:serverless-test1'\n\n\ndef example_with_statement():\n # DataAPI supports with statement for handling transaction\n with DataAPI(database=database, resource_arn=resource_arn, secret_arn=secret_arn) as data_api:\n\n # start transaction\n\n insert: Insert = Insert(Pets, {'name': 'dog'})\n # INSERT INTO pets (name) VALUES ('dog')\n\n # `execute` accepts SQL statement as str or SQL Alchemy SQL objects\n result: Result = data_api.execute(insert)\n print(result.number_of_records_updated)\n # 1\n\n query = Query(Pets).filter(Pets.id == 1)\n result: Result = data_api.execute(query) # or data_api.execute('select id, name from pets')\n # SELECT pets.id, pets.name FROM pets WHERE pets.id = 1\n\n # `Result` like a Result object in SQL Alchemy\n print(result.scalar())\n # 1\n\n print(result.one())\n # [Record]\n\n # `Result` is Sequence[Record]\n records: List[Record] = list(result)\n print(records)\n # [Record]\n\n # Record is Sequence and Iterator\n record = records[0]\n print(record[0])\n # 1\n print(record[1])\n # dog\n\n for column in record:\n print(column)\n # 1 ...\n\n # show record as dict()\n print(record.dict())\n # {'id': 1, 'name': 'dog'}\n\n # batch insert\n insert: Insert = Insert(Pets)\n data_api.batch_execute(insert, [\n {'id': 2, 'name': 'cat'},\n {'id': 3, 'name': 'snake'},\n {'id': 4, 'name': 'rabbit'},\n ])\n\n result = data_api.execute('select * from pets')\n print(list(result))\n # [Record, Record, Record, Record]\n\n # result is a sequence object\n for record in result:\n print(record)\n # Record ...\n\n # commit\n\n\ndef example_decorator():\n pet_names: List[str] = ['dog', 'cat', 'snake']\n add_pets(pet_names)\n\n\n@transaction(database=database, resource_arn=resource_arn, secret_arn=secret_arn)\ndef add_pets(data_api: DataAPI, pet_names: List[str]) -> None:\n # start transaction\n for pet_name in pet_names:\n data_api.execute(Insert(Pets, {'name': pet_name}))\n # some logic ...\n\n # commit\n\n\ndef example_simple_execute():\n data_api = DataAPI(resource_arn, secret_arn, database=database)\n result: Result = data_api.execute('show tables')\n print(result.scalar())\n # Pets\n\n\ndef example_rollback():\n with DataAPI(resource_arn, secret_arn) as data_api:\n data_api.execute(Insert(Pets, {'name': 'dog'}))\n # you can rollback by Exception\n raise Exception\n\n\ndef example_rollback_with_custom_exception():\n class OriginalError(Exception):\n pass\n\n with DataAPI(resource_arn, secret_arn, rollback_exception=OriginalError) as data_api:\n\n data_api.execute(Insert(Pets, {'name': 'dog'}))\n # some logic ...\n\n # rollback when happen `rollback_exception`\n raise OriginalError # rollback\n\n # raise Exception <- DataAPI don't rollback\n\ndef example_driver_for_sqlalchemy():\n from sqlalchemy.engine import create_engine\n engine = create_engine(\n 'mysql+pydataapi://',\n connect_args={\n 'resource_arn': 'arn:aws:rds:us-east-1:123456789012:cluster:dummy',\n 'secret_arn': 'arn:aws:secretsmanager:us-east-1:123456789012:secret:dummy',\n 'database': 'test'}\n )\n\n result: ResultProxy = engine.execute(\"select * from pets\")\n print(result.fetchall())\n\n```\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Leafeanking/py-data-api-postgres", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "pydataapi-postgres", "package_url": "https://pypi.org/project/pydataapi-postgres/", "platform": "", "project_url": "https://pypi.org/project/pydataapi-postgres/", "project_urls": { "Homepage": "https://github.com/Leafeanking/py-data-api-postgres" }, "release_url": "https://pypi.org/project/pydataapi-postgres/0.1.3/", "requires_dist": [ "boto3 (==1.9.243)", "SQLAlchemy (==1.3.7)", "pydantic (==1.0b1)", "setuptools-scm ; extra == 'all'", "mkdocs ; extra == 'all'", "mkdocs-material ; extra == 'all'", "wheel ; extra == 'all'", "twine ; extra == 'all'", "mkdocs ; extra == 'docs'", "mkdocs-material ; extra == 'docs'", "setuptools-scm ; extra == 'setup'", "wheel ; extra == 'wheel'", "twine ; extra == 'wheel'" ], "requires_python": ">=3.6.1", "summary": "py-data-api is a user-friendly client for AWS Postgres Aurora Serverless Data API", "version": "0.1.3", "yanked": false, "yanked_reason": null }, "last_serial": 6053553, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "1b0c479b719c5e6662c96a397ef65891", "sha256": "67b773ff9f54ff47a845d3d4b3a3d1b55840eb7bf98ca0008da5ce2eb448ca73" }, "downloads": -1, "filename": "pydataapi_postgres-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "1b0c479b719c5e6662c96a397ef65891", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.1", "size": 11108, "upload_time": "2019-10-29T22:56:13", "upload_time_iso_8601": "2019-10-29T22:56:13.725204Z", "url": "https://files.pythonhosted.org/packages/de/d6/38f9c3d3cbb02cee46ca8f5ee9dc1b45130d70dd313fdd59eb76b373c349/pydataapi_postgres-0.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ba37d58e113fc075c36f0a54e5b865a9", "sha256": "772dcc5f6250699673a31256e3d4a3dd71b1bc8fd3c18b528be7cd671055dd68" }, "downloads": -1, "filename": "pydataapi-postgres-0.1.0.tar.gz", "has_sig": false, "md5_digest": "ba37d58e113fc075c36f0a54e5b865a9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.1", "size": 13009, "upload_time": "2019-10-29T22:56:16", "upload_time_iso_8601": "2019-10-29T22:56:16.128966Z", "url": "https://files.pythonhosted.org/packages/20/a5/b9dc587048d91a15b933eaf89647a7d1b0e998fd41c7908ee9e328d417f8/pydataapi-postgres-0.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "55bc4aaa72bddc16f926515043eecff8", "sha256": "d0a862a5b9982057efa3d0752b8f631fc862fef41c53de33b78ca038a80f2ef0" }, "downloads": -1, "filename": "pydataapi_postgres-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "55bc4aaa72bddc16f926515043eecff8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.1", "size": 20726, "upload_time": "2019-10-30T15:57:11", "upload_time_iso_8601": "2019-10-30T15:57:11.418666Z", "url": "https://files.pythonhosted.org/packages/e8/29/ed7b7615058364ba7398aa5ad4218e49898901c05fc0b5c0cf0e0e478ccd/pydataapi_postgres-0.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b741b1f335f33c932730433aeca47e02", "sha256": "e0091b5ef925e96500fadb4effd85c35861d2a3f8844673984ccd44728f39394" }, "downloads": -1, "filename": "pydataapi_postgres-0.1.1.tar.gz", "has_sig": false, "md5_digest": "b741b1f335f33c932730433aeca47e02", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.1", "size": 13025, "upload_time": "2019-10-30T15:57:12", "upload_time_iso_8601": "2019-10-30T15:57:12.970056Z", "url": "https://files.pythonhosted.org/packages/af/00/4fd0db19cb780e0e8bab2a519dae7c9804ab9acf2f683b671bf32ccbb7be/pydataapi_postgres-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "4f7c44586d77676db3ab799ae0c0d3bb", "sha256": "44f1f6373e625c924012f6508f42920be5f780217b03f354cd1202c7dc1609da" }, "downloads": -1, "filename": "pydataapi_postgres-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "4f7c44586d77676db3ab799ae0c0d3bb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.1", "size": 20726, "upload_time": "2019-10-30T16:09:14", "upload_time_iso_8601": "2019-10-30T16:09:14.232418Z", "url": "https://files.pythonhosted.org/packages/1e/e4/8806b3e9ec3cb71189b1614ed02f4a59424f1a46896caddbb713adedf1bc/pydataapi_postgres-0.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "86d9f301a28fbb5c75e4819fb2ab75cb", "sha256": "15d12380480a62465e0fb2be42ba0fa6832b2431a732df832765a9590ac32f5a" }, "downloads": -1, "filename": "pydataapi_postgres-0.1.2.tar.gz", "has_sig": false, "md5_digest": "86d9f301a28fbb5c75e4819fb2ab75cb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.1", "size": 13028, "upload_time": "2019-10-30T16:09:15", "upload_time_iso_8601": "2019-10-30T16:09:15.715899Z", "url": "https://files.pythonhosted.org/packages/cc/62/501ce656261d3a9716e23e94f551e81a9b88c7b04522f08a96c3f1b38bc4/pydataapi_postgres-0.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "c7c97be2dda0d3d9745ca907f299a361", "sha256": "4e73e01ee2bb51e31dec1c1e422b628098ebcc86550b38b0b1e942855382db82" }, "downloads": -1, "filename": "pydataapi_postgres-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "c7c97be2dda0d3d9745ca907f299a361", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.1", "size": 20733, "upload_time": "2019-10-30T16:18:48", "upload_time_iso_8601": "2019-10-30T16:18:48.114427Z", "url": "https://files.pythonhosted.org/packages/60/51/25248ed31ae72a6314b5339a6ddc1fe99907de9e27ed3ba9f1a900aa3a2f/pydataapi_postgres-0.1.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d7ce146fdbabdd216f1828debc1b78a8", "sha256": "e2fbb550659b4d4b63bcd10326e9d2decc99b0b39b86c8feb73170e523c3bff7" }, "downloads": -1, "filename": "pydataapi_postgres-0.1.3.tar.gz", "has_sig": false, "md5_digest": "d7ce146fdbabdd216f1828debc1b78a8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.1", "size": 13030, "upload_time": "2019-10-30T16:18:49", "upload_time_iso_8601": "2019-10-30T16:18:49.767799Z", "url": "https://files.pythonhosted.org/packages/62/29/32e4d1c3958c0411364c01aac41da012258e0c0fe80c49227363c5fd6a4c/pydataapi_postgres-0.1.3.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c7c97be2dda0d3d9745ca907f299a361", "sha256": "4e73e01ee2bb51e31dec1c1e422b628098ebcc86550b38b0b1e942855382db82" }, "downloads": -1, "filename": "pydataapi_postgres-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "c7c97be2dda0d3d9745ca907f299a361", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.1", "size": 20733, "upload_time": "2019-10-30T16:18:48", "upload_time_iso_8601": "2019-10-30T16:18:48.114427Z", "url": "https://files.pythonhosted.org/packages/60/51/25248ed31ae72a6314b5339a6ddc1fe99907de9e27ed3ba9f1a900aa3a2f/pydataapi_postgres-0.1.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d7ce146fdbabdd216f1828debc1b78a8", "sha256": "e2fbb550659b4d4b63bcd10326e9d2decc99b0b39b86c8feb73170e523c3bff7" }, "downloads": -1, "filename": "pydataapi_postgres-0.1.3.tar.gz", "has_sig": false, "md5_digest": "d7ce146fdbabdd216f1828debc1b78a8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.1", "size": 13030, "upload_time": "2019-10-30T16:18:49", "upload_time_iso_8601": "2019-10-30T16:18:49.767799Z", "url": "https://files.pythonhosted.org/packages/62/29/32e4d1c3958c0411364c01aac41da012258e0c0fe80c49227363c5fd6a4c/pydataapi_postgres-0.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }