{"id":19989158,"url":"https://github.com/oreoxmt/tidbcloudy","last_synced_at":"2025-05-04T09:32:39.716Z","repository":{"id":64239392,"uuid":"521268531","full_name":"Oreoxmt/tidbcloudy","owner":"Oreoxmt","description":"Python SDK for TiDB Cloud","archived":false,"fork":false,"pushed_at":"2023-10-14T08:29:13.000Z","size":142,"stargazers_count":4,"open_issues_count":2,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-11-03T23:19:40.324Z","etag":null,"topics":["sdk-python","tidb","tidbcloud"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Oreoxmt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-08-04T13:01:37.000Z","updated_at":"2024-01-10T11:07:51.000Z","dependencies_parsed_at":"2023-01-15T06:16:03.631Z","dependency_job_id":"b4452731-8bb1-4e05-822e-a24a0df9b250","html_url":"https://github.com/Oreoxmt/tidbcloudy","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oreoxmt%2Ftidbcloudy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oreoxmt%2Ftidbcloudy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oreoxmt%2Ftidbcloudy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oreoxmt%2Ftidbcloudy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Oreoxmt","download_url":"https://codeload.github.com/Oreoxmt/tidbcloudy/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224391419,"owners_count":17303609,"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","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":["sdk-python","tidb","tidbcloud"],"created_at":"2024-11-13T04:45:39.936Z","updated_at":"2024-11-13T04:45:40.476Z","avatar_url":"https://github.com/Oreoxmt.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Python SDK for TiDB Cloud\n\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n\n`tidbcloudy` is an **unofficial** Python SDK for [TiDB Cloud](https://tidbcloud.com). If you encounter any problems or have suggestions, feel free to open an issue on the GitHub repository [Oreoxmt/tidbcloudy](https://github.com/Oreoxmt/tidbcloudy).\n\n## Table of contents\n\n- [Introduction](https://github.com/Oreoxmt/tidbcloudy#introduction)\n\n    - [Compatibility with TiDB Cloud API](https://github.com/Oreoxmt/tidbcloudy#compatibility-with-tidb-cloud-api)\n    - [Enhancements comparing to original TiDB Cloud API](https://github.com/Oreoxmt/tidbcloudy#enhancements-comparing-to-original-tidb-cloud-api)\n\n- [Installation](https://github.com/Oreoxmt/tidbcloudy#installation)\n- [Usage](https://github.com/Oreoxmt/tidbcloudy#usage)\n\n    - [Prerequisites](https://github.com/Oreoxmt/tidbcloudy#prerequisites)\n    - [List all resources in your organization](https://github.com/Oreoxmt/tidbcloudy#list-all-resources-in-your-organization)\n    - [Create a project and manage your AWS CMEK](https://github.com/Oreoxmt/tidbcloudy#create-a-project-and-manage-your-aws-cmek) **New in 1.0.9**\n    - [Create a cluster](https://github.com/Oreoxmt/tidbcloudy#create-a-cluster)\n    - [Connect to TiDB](https://github.com/Oreoxmt/tidbcloudy#connect-to-tidb)\n    - [Modify a cluster](https://github.com/Oreoxmt/tidbcloudy#modify-a-cluster)\n    - [Backup and restore](https://github.com/Oreoxmt/tidbcloudy#backup-and-restore)\n    - [Pause or resume your cluster](https://github.com/Oreoxmt/tidbcloudy#pause-or-resume-your-cluster) **New in 1.0.0**\n    - [Get monthly bills of your organization](https://github.com/Oreoxmt/tidbcloudy#get-monthly-bills-of-your-organization) **New in 1.0.8**\n    - [Delete all resources](https://github.com/Oreoxmt/tidbcloudy#delete-all-resources)\n\n- [Related projects](https://github.com/Oreoxmt/tidbcloudy#related-projects)\n\n## Introduction\n\nFor more information about TiDB Cloud API, see TiDB Cloud API Documentation ([v1beta](https://docs.pingcap.com/tidbcloud/api/v1beta) and [v1beta1](https://docs.pingcap.com/tidbcloud/api/v1beta1)).\n\n\u003e TiDB Cloud is a fully-managed Database-as-a-Service (DBaaS) that brings everything great about TiDB to your cloud.\n\nIf you do not have a TiDB Cloud account yet, you can sign up [here](https://tidbcloud.com). For more details about TiDB Cloud, refer to [TiDB Cloud Documentation](https://docs.pingcap.com/tidbcloud).\n\nYou can use this SDK to access [TiDB Cloud](https://tidbcloud.com) and manage your billings, projects, clusters, backups and restores:\n\n- manage your **billings** of your organization (_get_)\n- manage your TiDB Cloud **projects** (_list_, _create_) and manage the **AWS CMEK** of your projects (_get_, _create_)\n- list all available cloud providers (AWS and GCP), regions, and specifications before creating or modifying a cluster\n- manage your TiDB Serverless or TiDB Dedicated **clusters** (_create_, _modify_, _pause_, _resume_, _get_, _list_, _delete_)\n- manage your **backups** of a cluster (_create_, _get_, _list_, _delete_)\n- manage your **restores** of a project (_create_, _get_, _list_)\n\n### Compatibility with TiDB Cloud API\n\n`tidbcloudy` is compatible with TiDB Cloud API. **Endpoints added in [v1beta Release 20230228](https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20230228) and [v1beta Release 20230905](https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20230905) are not supported for now**. The following table lists the compatibility between `tidbcloudy` and TiDB Cloud API.\n\n\u003ctable\u003e\n\u003cthead\u003e\n  \u003ctr\u003e\n    \u003cth rowspan=\"2\"\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta1\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eTiDB Cloud API v1beta1\u003c/a\u003e\u003c/th\u003e\n    \u003cth colspan=\"13\"\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eTiDB Cloud API v1beta\u003c/a\u003e\u003c/th\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta1#section/API-Changelog/2023-09-28\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e2023-09-28\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20230905\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e20230905\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20230801\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e20230801\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20230602\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e20230602\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20230328\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e20230328\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20230321\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e20230321\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20230228\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e20230228\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20230214\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e20230214\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20230104\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e20230104\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20221028\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e20221028\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20220920\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e20220920\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20220906\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e20220906\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20220823\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e20220823\u003c/a\u003e\u003c/th\u003e\n    \u003cth\u003e\u003ca href=\"https://docs.pingcap.com/tidbcloud/api/v1beta#section/API-Changelog/20220809\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e20220809\u003c/a\u003e\u003c/th\u003e\n  \u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v1.1.1\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e1.1.1\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v1.1.0\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e1.1.0\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v1.0.10\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e1.0.10\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v1.0.9\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e1.0.9\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v1.0.8\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e1.0.8\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v1.0.7\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e1.0.7\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v1.0.6\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e1.0.6\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v1.0.5\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e1.0.5\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v1.0.4\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e1.0.4\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e❌\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v1.0.3\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e1.0.3\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v1.0.2\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e1.0.2\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v1.0.1\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e1.0.1\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v1.0.0\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e1.0.0\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v0.2.2\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e0.2.2\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v0.2.1\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e0.2.1\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/Oreoxmt/tidbcloudy/releases/tag/v0.2.0\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e0.2.0\u003c/a\u003e\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e/\u003c/td\u003e\n    \u003ctd\u003e✅\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n### Enhancements comparing to original [TiDB Cloud API](https://docs.pingcap.com/tidbcloud/api/v1beta)\n\n- **Iterate over** resources instead of manual pagination\n- **Connect to a TiDB cluster** using the [MySQL client](https://github.com/PyMySQL/mysqlclient)\n- **Get** a Project using a Project **ID**\n- Configure your cluster with **method chaining**\n- Add your **current IP address automatically**\n- **Wait for the cluster to be ready** when creating/modifying a cluster\n- **Case-insensitive** when setting cluster type, cloud provider, and component name\n\n## Installation\n\n```bash\npip3 install tidbcloudy\n```\n\n⚠️ Make sure that you have installed **mysql client** in your environment. For more information, see [PyMySQL/mysqlclient](https://github.com/PyMySQL/mysqlclient#install).\n\n## Usage\n\n### Prerequisites\n\n- Create a TiDB Cloud account.\n- Create a TiDB Cloud API key. To manage your API keys, see [TiDB Cloud API Documentation](https://docs.pingcap.com/tidbcloud/api/v1beta#section/Authentication/API-Key-Management).\n- Install the latest version of `tidbcloudy`.\n\nTo get full code examples, see the [`examples`](https://github.com/Oreoxmt/tidbcloudy/tree/main/examples) folder.\n\n\u003e Note:\n\u003e\n\u003e It is recommended to set environment variables for your API public and private key. For example, in bash, you can:\n\u003e\n\u003e ```bash\n\u003e export PUBLIC_KEY=your_api_public_key\n\u003e export PRIVATE_KEY=your_api_private_key\n\u003e ```\n\n### List all resources in your organization\n\n**This feature is available in `tidbcloudy` 1.0.9 or later.**\n\nTo get the full code example of listing all projects, clusters, backup tasks, and restore tasks in your organization, see [`0_list_resources.py`](https://github.com/Oreoxmt/tidbcloudy/tree/main/examples/0_list_resources.py).\n\n```python\nimport os\n\nimport tidbcloudy\nfrom tidbcloudy.specification import ClusterType\n\npublic_key = os.environ.get(\"PUBLIC_KEY\")\nprivate_key = os.environ.get(\"PRIVATE_KEY\")\n\napi = tidbcloudy.TiDBCloud(public_key=public_key, private_key=private_key)\n\nfor project in api.iter_projects():\n    print(project)\n    if project.aws_cmek_enabled:\n        for aws_cmek in project.iter_aws_cmek():\n            print(aws_cmek)\n    for cluster in project.iter_clusters():\n        print(cluster)\n        if cluster.cluster_type == ClusterType.DEDICATED:\n            for backup in cluster.iter_backups():\n                print(backup)\n    for restore in project.iter_restores():\n        print(restore)\n```\n\n### Create a project and manage your AWS CMEK\n\nTo create a project, run the [`8_manage_project.py`](https://github.com/Oreoxmt/tidbcloudy/tree/main/examples/8_manage_project.py).\n\n```python\nimport os\n\nimport tidbcloudy\n\npublic_key = os.environ.get(\"PUBLIC_KEY\")\nprivate_key = os.environ.get(\"PRIVATE_KEY\")\ndebug_mode = os.environ.get(\"TIDBCLOUDY_LOG\")\n\napi = tidbcloudy.TiDBCloud(public_key=public_key, private_key=private_key)\n# Create a project with AWS CMEK enabled\nproject = api.create_project(name=\"0\", aws_cmek_enabled=True, update_from_server=True)\nprint(project)\n\n# Configure AWS CMEK for the project\nproject.create_aws_cmek([(\"your_aws_region_1\", \"your_aws_kms_arn_1\"), (\"your_aws_region_2\", \"your_aws_kms_arn_2\")])\n\n# List all AWS CMEKs of the project\nfor cmek in project.iter_aws_cmek():\n    print(cmek)\n```\n\n### Create a cluster\n\nBefore creating a cluster, you should list all available provider regions and cluster configuration specifications. For more details, run the [`1_list_provider_regions.py`](https://github.com/Oreoxmt/tidbcloudy/tree/main/examples/1_list_provider_regions.py).\n\n```python\nimport os\n\nimport tidbcloudy\n\npublic_key = os.environ.get(\"PUBLIC_KEY\")\nprivate_key = os.environ.get(\"PRIVATE_KEY\")\n\napi = tidbcloudy.TiDBCloud(public_key=public_key, private_key=private_key)\n\nfor spec in api.list_provider_regions():\n    print(f\"- type: {spec.cluster_type.value}\")\n    print(f\"  provider: {spec.cloud_provider.value}\")\n    print(f\"  region: {spec.region}\")\n    print(f\"  components:\")\n    for tidb in spec.tidb:\n        print(f\"  - tidb: {tidb.node_size}; \"\n              f\"min={tidb.node_quantity_range.min} step={tidb.node_quantity_range.step}\")\n    for tikv in spec.tikv:\n        print(f\"  - tikv: {tikv.node_size}; \"\n              f\"min={tikv.node_quantity_range.min} \"\n              f\"step={tikv.node_quantity_range.step}; \"\n              f\"{tikv.storage_size_gib_range.min}..{tikv.storage_size_gib_range.max} GiB\")\n    for tiflash in spec.tiflash:\n        print(\n            f\"  - tiflash: {tiflash.node_size}; \"\n            f\"min={tiflash.node_quantity_range.min} step={tiflash.node_quantity_range.step}; \"\n            f\"{tiflash.storage_size_gib_range.min}..{tiflash.storage_size_gib_range.max} GiB\")\n```\n\n\u003e Note:\n\u003e\n\u003e Creating a cluster might cost money. For more details, see [TiDB Cloud pricing details](https://www.pingcap.com/tidb-cloud-pricing-details).\n\nTo create a TiDB Serverless cluster, run the [`2_1_create_serverless_cluster.py`](https://github.com/Oreoxmt/tidbcloudy/tree/main/examples/2_1_create_serverless_cluster.py).\n\nTo create a TiDB Dedicated cluster, run the [`2_2_create_dedicated_cluster.py`](https://github.com/Oreoxmt/tidbcloudy/tree/main/examples/2_2_create_dedicated_cluster.py).\n\nThe following takes creating a TiDB Serverless cluster as an example:\n\n```python\nimport os\nimport tidbcloudy\nfrom tidbcloudy.specification import CreateClusterConfig\n\npublic_key = os.environ.get(\"PUBLIC_KEY\")\nprivate_key = os.environ.get(\"PRIVATE_KEY\")\ndebug_mode = os.environ.get(\"TIDBCLOUDY_LOG\")\nproject_id = os.environ.get(\"PROJECT_ID\", \"1234567890123456789\")\n\napi = tidbcloudy.TiDBCloud(public_key=public_key, private_key=private_key)\nproject = api.get_project(project_id, update_from_server=True)\n\nconfig = CreateClusterConfig()\nconfig\\\n    .set_name(\"serverless-0\") \\\n    .set_cluster_type(\"DEVELOPER\") \\\n    .set_cloud_provider(\"AWS\") \\\n    .set_region(\"us-west-2\") \\\n    .set_root_password(\"your_root_password\")\ncluster = project.create_cluster(config)\nprint(cluster)\n\ncluster.wait_for_available(interval_sec=1)\nprint(cluster)\n```\n\n### Connect to TiDB\n\nTo connect to your TiDB cluster, run the [`3_connect_mysql.py`](https://github.com/Oreoxmt/tidbcloudy/tree/main/examples/3_connect_mysql.py).\n\n```python\nimport os\n\nimport tidbcloudy\nfrom tidbcloudy.specification import ClusterStatus\n\npublic_key = os.environ.get(\"PUBLIC_KEY\")\nprivate_key = os.environ.get(\"PRIVATE_KEY\")\nproject_id = os.environ.get(\"PROJECT_ID\", \"1234567890123456789\")\ncluster_id = os.environ.get(\"CLUSTER_ID\", \"1234567890123456789\")\n\nprint(\"Connecting to TiDB Cloud...\")\napi = tidbcloudy.TiDBCloud(public_key=public_key, private_key=private_key)\nproject = api.get_project(project_id, update_from_server=True)\ncluster = project.get_cluster(cluster_id)\nprint(cluster)\n\nif cluster.status.cluster_status == ClusterStatus.AVAILABLE:\n    connection_strings = cluster.status.connection_strings\n    connection = cluster.connect(type=\"standard\", database=\"test\", password=os.environ.get(\"CLUSTER_PWD\", \"your_root_password\"))\n    print(connection)\n    with connection:\n        with connection.cursor() as cursor:\n            cursor.execute(\"SELECT DATABASE();\")\n            m = cursor.fetchone()\n            print(m[0])\n```\n\n### Modify a cluster\n\n\u003e Note:\n\u003e\n\u003e Modify a cluster might cost money. For more details, see [TiDB Cloud pricing details](https://www.pingcap.com/tidb-cloud-pricing-details).\n\nTo modify a cluster, run the [`4_scale_a_cluster.py`](https://github.com/Oreoxmt/tidbcloudy/tree/main/examples/4_scale_a_cluster.py).\n\n```python\nimport os\n\nimport tidbcloudy\nfrom tidbcloudy.specification import UpdateClusterConfig\n\npublic_key = os.environ.get(\"PUBLIC_KEY\")\nprivate_key = os.environ.get(\"PRIVATE_KEY\")\nproject_id = os.environ.get(\"PROJECT_ID\", \"1234567890123456789\")\ncluster_id = os.environ.get(\"CLUSTER_ID\", \"1234567890123456789\")\n\napi = tidbcloudy.TiDBCloud(public_key=public_key, private_key=private_key)\nproject = api.get_project(project_id, update_from_server=True)\ncluster = project.get_cluster(cluster_id)\n\nprint(\"The original config is: {}\".format(cluster.config.components.to_object()))\n\nnew_config = UpdateClusterConfig()\nnew_config.update_component(\"tiflash\", node_quantity=1, node_size=\"8C64G\", storage_size_gib=500)\ncluster.update(new_config)\ncluster.wait_for_available()\n\nprint(\"The new config is: {}\".format(cluster.config.components.to_object()))\n```\n\n### Backup and restore\n\n\u003e Note:\n\u003e\n\u003e Backup or restore a cluster might cost money. For more details, see [TiDB Cloud pricing details](https://www.pingcap.com/tidb-cloud-pricing-details).\n\nTo create a backup and restore, run the [`5_backup_restore.py`](https://github.com/Oreoxmt/tidbcloudy/tree/main/examples/5_backup_restore.py)\n\n```python\nimport os\n\nimport tidbcloudy\nfrom tidbcloudy.specification import CreateClusterConfig\n\npublic_key = os.environ.get(\"PUBLIC_KEY\")\nprivate_key = os.environ.get(\"PRIVATE_KEY\")\nproject_id = os.environ.get(\"PROJECT_ID\", \"1234567890123456789\")\ncluster_id = os.environ.get(\"CLUSTER_ID\", \"1234567890123456789\")\nbackup_id = \"1234567\"\n\napi = tidbcloudy.TiDBCloud(public_key=public_key, private_key=private_key)\nproject = api.get_project(project_id, update_from_server=True)\ncluster = project.get_cluster(cluster_id)\nprint(\"Create a manual backup task\")\nbackup = cluster.create_backup(name=\"backup-1\", description=\"automatically generated by tidbcloudy\")\nprint(backup)\n\nconfig = CreateClusterConfig()\nconfig \\\n    .set_cluster_type(\"DEDICATED\") \\\n    .set_cloud_provider(\"AWS\") \\\n    .set_region(\"us-west-2\") \\\n    .set_port(4399) \\\n    .set_root_password(\"your_root_password\") \\\n    .set_component(\"tidb\", \"8C16G\", 1) \\\n    .set_component(\"tikv\", \"8C32G\", 3, 500) \\\n    .set_component(\"tiflash\", \"8C64G\", 1, 500) \\\n    .add_current_ip_access()\nprint(\"Create a restore task from backup_id={}\".format(backup_id))\nrestore = project.create_restore(backup_id=backup_id, name=\"restore-1\", cluster_config=config)\nrestore_task = project.get_restore(restore.id)\nprint(restore_task.to_object())\nfor restore in project.iter_restores():\n    print(restore)\n```\n\n### Pause or resume your cluster\n\n**This feature is available in `tidbcloudy` 1.0.0 or later.**\n\nTo pause or resume your cluster, run the [`6_pause_cluster.py`](https://github.com/Oreoxmt/tidbcloudy/tree/main/examples/6_pause_cluster.py).\n\n```python\nimport os\n\nimport tidbcloudy\nfrom tidbcloudy.specification import ClusterStatus\n\npublic_key = os.environ.get(\"PUBLIC_KEY\")\nprivate_key = os.environ.get(\"PRIVATE_KEY\")\nproject_id = os.environ.get(\"PROJECT_ID\", \"1234567890123456789\")\ncluster_id = os.environ.get(\"CLUSTER_ID\", \"1234567890123456789\")\n\napi = tidbcloudy.TiDBCloud(public_key=public_key, private_key=private_key)\nproject = api.get_project(project_id, update_from_server=True)\ncluster = project.get_cluster(cluster_id)\n\nif cluster.status.cluster_status == ClusterStatus.AVAILABLE:\n    print(\"Pause the cluster id={}\".format(cluster_id))\n    cluster.pause()\nif cluster.status.cluster_status == ClusterStatus.PAUSED:\n    print(\"Resume the cluster id={}\".format(cluster_id))\n    cluster.resume()\nif cluster.status.cluster_status == ClusterStatus.RESUMING:\n    print(\"Wait for the RESUMING cluster id={} to be available\".format(cluster_id))\n    cluster.wait_for_available()\n```\n\n### Get monthly bills of your organization\n\n**This feature is available in `tidbcloudy` 1.0.8 or later.**\n\nTo get the billing information of your organization, run the [`v1beta1_get_monthly_bill.py`](https://github.com/Oreoxmt/tidbcloudy/tree/main/examples/v1beta1_get_monthly_bill.py).\n\n```python\nimport os\n\nimport tidbcloudy\n\npublic_key = os.environ.get(\"PUBLIC_KEY\")\nprivate_key = os.environ.get(\"PRIVATE_KEY\")\ndebug_mode = os.environ.get(\"TIDBCLOUDY_LOG\")\n\napi = tidbcloudy.TiDBCloud(public_key=public_key, private_key=private_key)\nbilling = api.get_monthly_bill(month=\"2023-10\")\n# billing = api.get_monthly_bill(month=\"202310\")\n# billing = api.get_current_month_bill()\nprint(billing)\nprint(billing.overview)\nprint(billing.summaryByProject)\nprint(billing.summaryByService)\n```\n\n### Delete all resources\n\n\u003e Warning:\n\u003e\n\u003e This is a destructive operation. It will delete all resources in the project. **DO NOT** run this script in a production environment.\n\nTo delete all clusters and backup tasks in your project, run the [`7_delete_resources.py`](https://github.com/Oreoxmt/tidbcloudy/tree/main/examples/7_delete_resources.py).\n\n```python\nimport os\n\nimport tidbcloudy\nfrom tidbcloudy.specification import ClusterType\n\npublic_key = os.environ.get(\"PUBLIC_KEY\")\nprivate_key = os.environ.get(\"PRIVATE_KEY\")\nproject_id = os.environ.get(\"PROJECT_ID\", \"1234567890123456789\")\n\napi = tidbcloudy.TiDBCloud(public_key=public_key, private_key=private_key)\nproject = api.get_project(project_id, update_from_server=True)\nfor cluster in project.iter_clusters():\n    print(cluster)\n    if cluster.cluster_type == ClusterType.DEDICATED:\n        for backup in cluster.iter_backups():\n            print(backup)\n            backup.delete()\n    cluster.delete()\n```\n\n## Related projects\n\n- Go SDK: [go-tidbcloud-sdk-v1](https://github.com/c4pt0r/go-tidbcloud-sdk-v1) by [@c4pt0r](https://github.com/c4pt0r)\n- Official TiDB Cloud CLI: [tidbcloud-cli](https://github.com/tidbcloud/tidbcloud-cli) | [User documentation](https://docs.pingcap.com/tidbcloud/cli-reference)\n- Official code samples in Go and Python: [tidbcloud-api-samples](https://github.com/tidbcloud/tidbcloud-api-samples)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foreoxmt%2Ftidbcloudy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foreoxmt%2Ftidbcloudy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foreoxmt%2Ftidbcloudy/lists"}