{"id":16101855,"url":"https://github.com/koxudaxi/local-data-api","last_synced_at":"2025-07-30T11:10:46.022Z","repository":{"id":37180803,"uuid":"189569756","full_name":"koxudaxi/local-data-api","owner":"koxudaxi","description":"Data API for local, you can write unittest for AWS Aurora Serverless's Data API  ","archived":false,"fork":false,"pushed_at":"2024-06-13T09:26:51.000Z","size":1483,"stargazers_count":113,"open_issues_count":23,"forks_count":22,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-07-22T02:54:25.245Z","etag":null,"topics":["api","aurora","aws","aws-aurora","data-api","dataapi","kotlin","ktor","local","mock","mysql","proxy","python","python3","serverless","test","unittest"],"latest_commit_sha":null,"homepage":"https://koxudaxi.github.io/local-data-api","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/koxudaxi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":"FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["koxudaxi"]}},"created_at":"2019-05-31T09:44:40.000Z","updated_at":"2025-07-17T16:51:00.000Z","dependencies_parsed_at":"2024-10-09T18:51:34.896Z","dependency_job_id":null,"html_url":"https://github.com/koxudaxi/local-data-api","commit_stats":null,"previous_names":[],"tags_count":52,"template":false,"template_full_name":null,"purl":"pkg:github/koxudaxi/local-data-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koxudaxi%2Flocal-data-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koxudaxi%2Flocal-data-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koxudaxi%2Flocal-data-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koxudaxi%2Flocal-data-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/koxudaxi","download_url":"https://codeload.github.com/koxudaxi/local-data-api/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koxudaxi%2Flocal-data-api/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267858226,"owners_count":24155917,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-30T02:00:09.044Z","response_time":70,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","aurora","aws","aws-aurora","data-api","dataapi","kotlin","ktor","local","mock","mysql","proxy","python","python3","serverless","test","unittest"],"created_at":"2024-10-09T18:51:27.887Z","updated_at":"2025-07-30T11:10:45.853Z","avatar_url":"https://github.com/koxudaxi.png","language":"Python","readme":"# local-data-api - Local Data API for AWS Aurora Serverless Data API\n[![CI](https://github.com/koxudaxi/local-data-api/actions/workflows/ci.yml/badge.svg)](https://github.com/koxudaxi/local-data-api/actions/workflows/ci.yml)\n[![](https://images.microbadger.com/badges/version/koxudaxi/local-data-api.svg)](https://hub.docker.com/r/koxudaxi/local-data-api)\n[![](https://badgen.net/docker/pulls/koxudaxi/local-data-api)](https://hub.docker.com/r/koxudaxi/local-data-api)\n[![codecov](https://codecov.io/gh/koxudaxi/local-data-api/branch/master/graph/badge.svg)](https://codecov.io/gh/koxudaxi/local-data-api)\n![license](https://img.shields.io/github/license/koxudaxi/local-data-api.svg)\n\nIf you want to run tests on your local machine and CI then, local-data-api can run in your local machine with MySQL and PostgreSQL Servers.\n\n## What's AWS Aurora Serverless's Data API?\nhttps://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html\n\n## How does local-data-api work?\nlocal-data-api is \"proxy server\" to real databases.\n\nThe API converts RESTful request to SQL statements.\n\n## Support Database Types\n- MySQL\n- PostgreSQL\n\n## How to insert array data into PostgreSQL\nDataAPI have not support inserting array data with `SqlParameter` yet.\nBut, @ormu5 give us this workaround to insert array data.\n```sql\ninsert into cfg.attributes(id, type, attributes)\nvalues(:id, :type, cast(:attributes as text[]));\n```\nwhere the value for attributes parameter is a string properly formatted as Postgres array, e.g., `'{\"Volume\",\"Material\"}'`.\n\nThanks to @ormu5.\n\n\n\n## Version 0.6.0\n### local-data-api has been re-written in Kotlin\n#### Motivation\nThis project was written in Python at the start.\n\nBut, We need a JDBC driver that needs Java to reproduce real Data API behavior.\n\nI have re-written local-data-api in Kotlin. The design is the same as the old version.\n\nAlso, I wrote unittest and made coverage 100%. We welcome your feedback and error reports.\n\n\nRelated issue: [#70](https://github.com/koxudaxi/local-data-api/issues/70)\n\n\n## How to use this image\nYou set your MYSQL Server configs as environments.\n```bash\ndocker run --rm -it --name my-data-api -p 8080:80  -e MYSQL_HOST=\u003cYOUR_MYSQL_HOST\u003e -e MYSQL_PORT=\u003cYOUR_MYSQL_PORT\u003e -e MYSQL_USER=\u003cYOUR_MYSQL_USER\u003e -e MYSQL_PASSWORD=\u003cYOUR_MYSQL_PASS\u003e  -e RESOURCE_ARN=arn:aws:rds:us-east-1:123456789012:cluster:dummy -e SECRET_ARN=arn:aws:secretsmanager:us-east-1:123456789012:secret:dummy  koxudaxi/local-data-api\n```\n\nIn this case, you give local-data-api URL to aws client (like aws-cli).\n```bash\n$ aws --endpoint-url http://127.0.0.1:8080 rds-data execute-statement --resource-arn \"arn:aws:rds:us-east-1:123456789012:cluster:dummy\" --sql \"show databases\"  --secret-arn \"arn:aws:secretsmanager:us-east-1:123456789012:secret:dummy\" --database 'test'\n```\n## docker-compose\n### MySQL\ndocker-compose-mysql.yml\n```yaml\nversion: '3.1'\n\nservices:\n  local-data-api:\n    image: koxudaxi/local-data-api\n    restart: always\n    environment:\n      MYSQL_HOST: db\n      MYSQL_PORT: 3306\n      MYSQL_USER: root\n      MYSQL_PASSWORD: example\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    ports:\n      - \"8080:80\"\n  db:\n    image: mysql:5.6\n    command: --default-authentication-plugin=mysql_native_password\n    restart: always\n    environment:\n      MYSQL_ROOT_PASSWORD: example\n      MYSQL_DATABASE: test\n    ports:\n        - \"3306:3306\"\n```\n\n### docker-compose with Python's aws-sdk client(boto3) \n1. start local-data-api containers\n```bash\n$ docker-compose up -d\n```\n\n2. change a endpoint to local-data-api in your code. \n```bash\n$ ipython\n```\n```python\nIn [1]: import boto3; client = boto3.client('rds-data', endpoint_url='http://127.0.0.1:8080', aws_access_key_id='aaa',  aws_secret_access_key='bbb') \n```\n\n3. execute a sql statement\n```python\nIn [2]: client.execute_statement(resourceArn='arn:aws:rds:us-east-1:123456789012:cluster:dummy', secretArn='arn:aws:secretsmanager:us-east-1:123456789012:secret:dummy', sql='show databases', database='test')\n```\n\n#### If you use PostgreSQL, then you should run this line to check databases. \n```python\nIn [2]: client.execute_statement(resourceArn='arn:aws:rds:us-east-1:123456789012:cluster:dummy', secretArn='arn:aws:secretsmanager:us-east-1:123456789012:secret:dummy', sql='SELECT datname FROM pg_database', database='test')\n```\n\n4. local-data-api return the result from a MySQL Server.\n```python\nOut[2]: {'ResponseMetadata': {'HTTPStatusCode': 200,\n 'HTTPHeaders': {'date': 'Sun, 09 Jun 2019 18:35:22 GMT',\n 'server': 'uvicorn',\n 'content-length': '492',\n 'content-type': 'application/json'},\n 'RetryAttempts': 0},\n 'numberOfRecordsUpdated': 0,\n 'records': [[{'stringValue': 'information_schema'}],\n  [{'stringValue': 'mysql'}],\n  [{'stringValue': 'performance_schema'}],\n  [{'stringValue': 'sys'}],\n  [{'stringValue': 'test'}]]}\n```\n\nIf a table has some records, then the local-data-api can run `select`\n```python\nIn [3]: client.execute_statement(resourceArn='arn:aws:rds:us-east-1:123456789012:cluster:dummy', secretArn='arn:aws:secretsmanager:us-east-1:123456789012:secret:dummy', sql='select * from users', database='test')\n```\n```python\nOut[3]: {'ResponseMetadata': {'HTTPStatusCode': 200,\n 'HTTPHeaders': {'date': 'Sun, 09 Jun 2019 18:35:22 GMT',\n 'server': 'uvicorn',\n 'content-length': '492',\n 'content-type': 'application/json'},\n 'RetryAttempts': 0},\n 'numberOfRecordsUpdated': 0,\n 'records': [[{'longValue': 1}, {'stringValue': 'ichiro'}, {'longValue': 17}],\n  [{'longValue': 2}, {'stringValue': 'ken'}, {'longValue': 20}],\n  [{'longValue': 3}, {'stringValue': 'lisa'}, {'isNull': True}],}\n```\n\n\n### PostgreSQL\nNow, local-data-api supports PostgreSQL\n\ndocker-compose-postgres.yml\n```yaml\nversion: '3.1'\n\nservices:\n  local-data-api:\n    image: koxudaxi/local-data-api\n    restart: always\n    environment:\n      ENGINE: PostgreSQLJDBC\n      POSTGRES_HOST: db\n      POSTGRES_PORT: 5432\n      POSTGRES_USER: postgres\n      POSTGRES_PASSWORD: example\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    ports:\n      - \"8080:80\"\n  db:\n    image: postgres:10.7-alpine\n    restart: always\n    environment:\n      POSTGRES_PASSWORD: example\n      POSTGRES_DB: test\n    ports:\n        - \"5432:5432\"\n\n```\n\n\n## Contribute\nWe are waiting for your contributions to `local-data-api`.\n\n### How to contribute\n```bash\n## 1. Clone your fork repository\n$ git clone git@github.com:\u003cyour username\u003e/local-data-api.git\n$ cd local-data-api\n\n## 2. Open the project with IDE/Editor\nThe project path is `./kotlin/local-data-api`\n\n## 3. Run on your local machine\n### Shell on Linux or MacOS \n$ cd ./kotlin/local-data-api\n$ ./gradlew run\n\n### Command Prompt on Windows\n$ cd ./kotlin/local-data-api\n$ gradlew.bat run\n\n## 4. Create new branch and rewrite code.\n$ git checkout -b new-branch\n\n## 5. Run unittest\n$ cd ./kotlin/local-data-api\n$ ./gradlew test jacocoTestReport\n\n## 6. Run integration-test\n$ ./scripts/integration-test.sh\n\n## 7. Commit and Push...\n```\n\n## Related projects\n### py-data-api\n\nDataAPI client for Python\n\nhttps://github.com/koxudaxi/py-data-api\n\n## Docker Image \n\n[https://hub.docker.com/r/koxudaxi/local-data-api](https://hub.docker.com/r/koxudaxi/local-data-api)\n\n## Source Code\n\n[https://github.com/koxudaxi/local-data-api](https://github.com/koxudaxi/local-data-api)\n\n## Documentation\n\n[https://koxudaxi.github.io/local-data-api](https://koxudaxi.github.io/local-data-api)\n\n## License\n\nlocal-data-api is released under the MIT License. http://www.opensource.org/licenses/mit-license\n","funding_links":["https://github.com/sponsors/koxudaxi"],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkoxudaxi%2Flocal-data-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkoxudaxi%2Flocal-data-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkoxudaxi%2Flocal-data-api/lists"}