+
+1. Navigate to the [**Clusters**](https://tidbcloud.com/console/clusters) page, and then click the name of your target cluster to go to its overview page.
-def get_player(cursor: MySQLCursor, player_id: str) -> tuple:
- cursor.execute("SELECT id, coins, goods FROM player WHERE id = %s", (player_id,))
- return cursor.fetchone()
+2. Click **Connect** in the upper-right corner. A connection dialog is displayed.
+3. Ensure the configurations in the connection dialog match your operating environment.
-def get_players_with_limit(cursor: MySQLCursor, limit: int) -> List[tuple]:
- cursor.execute("SELECT id, coins, goods FROM player LIMIT %s", (limit,))
- return cursor.fetchall()
+ - **Endpoint Type** is set to `Public`
+ - **Connect With** is set to `General`
+ - **Operating System** matches your environment.
+ > **Tip:**
+ >
+ > If your program is running in Windows Subsystem for Linux (WSL), switch to the corresponding Linux distribution.
-def random_player(amount: int) -> List[tuple]:
- players = []
- for _ in range(amount):
- players.append((str(uuid.uuid4()), 10000, 10000))
+4. Click **Create password** to create a random password.
- return players
+ > **Tip:**
+ >
+ > If you have created a password before, you can either use the original password or click **Reset password** to generate a new one.
+5. Run the following command to copy `.env.example` and rename it to `.env`:
-def bulk_create_player(cursor: MySQLCursor, players: List[tuple]) -> None:
- cursor.executemany("INSERT INTO player (id, coins, goods) VALUES (%s, %s, %s)", players)
+ ```shell
+ cp .env.example .env
+ ```
+6. Copy and paste the corresponding connection string into the `.env` file. The example result is as follows:
-def get_count(cursor: MySQLCursor) -> int:
- cursor.execute("SELECT count(*) FROM player")
- return cursor.fetchone()[0]
+ ```dotenv
+ TIDB_HOST='{host}' # e.g. gateway01.ap-northeast-1.prod.aws.tidbcloud.com
+ TIDB_PORT='4000'
+ TIDB_USER='{user}' # e.g. xxxxxx.root
+ TIDB_PASSWORD='{password}'
+ TIDB_DB_NAME='test'
+ CA_PATH='{ssl_ca}' # e.g. /etc/ssl/certs/ca-certificates.crt (Debian / Ubuntu / Arch)
+ ```
+ Be sure to replace the placeholders `{}` with the connection parameters obtained from the connection dialog.
-def trade_check(cursor: MySQLCursor, sell_id: str, buy_id: str, amount: int, price: int) -> bool:
- get_player_with_lock_sql = "SELECT coins, goods FROM player WHERE id = %s FOR UPDATE"
+7. Save the `.env` file.
- # sell player goods check
- cursor.execute(get_player_with_lock_sql, (sell_id,))
- _, sell_goods = cursor.fetchone()
- if sell_goods < amount:
- print(f'sell player {sell_id} goods not enough')
- return False
+
+
- # buy player coins check
- cursor.execute(get_player_with_lock_sql, (buy_id,))
- buy_coins, _ = cursor.fetchone()
- if buy_coins < price:
- print(f'buy player {buy_id} coins not enough')
- return False
+1. Navigate to the [**Clusters**](https://tidbcloud.com/console/clusters) page, and then click the name of your target cluster to go to its overview page.
+2. Click **Connect** in the upper-right corner. A connection dialog is displayed.
-def trade_update(cursor: MySQLCursor, sell_id: str, buy_id: str, amount: int, price: int) -> None:
- update_player_sql = "UPDATE player set goods = goods + %s, coins = coins + %s WHERE id = %s"
+3. Click **Allow Access from Anywhere** and then click **Download TiDB cluster CA** to download the CA certificate.
- # deduct the goods of seller, and raise his/her the coins
- cursor.execute(update_player_sql, (-amount, price, sell_id))
- # deduct the coins of buyer, and raise his/her the goods
- cursor.execute(update_player_sql, (amount, -price, buy_id))
+ For more details about how to obtain the connection string, refer to [TiDB Dedicated standard connection](https://docs.pingcap.com/tidbcloud/connect-via-standard-connection).
+4. Run the following command to copy `.env.example` and rename it to `.env`:
-def trade(connection: MySQLConnection, sell_id: str, buy_id: str, amount: int, price: int) -> None:
- with connection.cursor() as cursor:
- if trade_check(cursor, sell_id, buy_id, amount, price) is False:
- connection.rollback()
- return
+ ```shell
+ cp .env.example .env
+ ```
- try:
- trade_update(cursor, sell_id, buy_id, amount, price)
- except Exception as err:
- connection.rollback()
- print(f'something went wrong: {err}')
- else:
- connection.commit()
- print("trade success")
+5. Copy and paste the corresponding connection string into the `.env` file. The example result is as follows:
+ ```dotenv
+ TIDB_HOST='{host}' # e.g. tidb.xxxx.clusters.tidb-cloud.com
+ TIDB_PORT='4000'
+ TIDB_USER='{user}' # e.g. root
+ TIDB_PASSWORD='{password}'
+ TIDB_DB_NAME='test'
+ CA_PATH='{your-downloaded-ca-path}'
+ ```
-def simple_example() -> None:
- with get_connection(autocommit=True) as connection:
- with connection.cursor() as cur:
- # create a player, who has a coin and a goods.
- create_player(cur, ("test", 1, 1))
+ Be sure to replace the placeholders `{}` with the connection parameters obtained from the connection dialog, and configure `CA_PATH` with the certificate path downloaded in the previous step.
- # get this player, and print it.
- test_player = get_player(cur, "test")
- print(f'id:{test_player[0]}, coins:{test_player[1]}, goods:{test_player[2]}')
+6. Save the `.env` file.
- # create players with bulk inserts.
- # insert 1919 players totally, with 114 players per batch.
- # each player has a random UUID
- player_list = random_player(1919)
- for idx in range(0, len(player_list), 114):
- bulk_create_player(cur, player_list[idx:idx + 114])
+
+
- # print the number of players
- count = get_count(cur)
- print(f'number of players: {count}')
+1. Run the following command to copy `.env.example` and rename it to `.env`:
- # print 3 players.
- three_players = get_players_with_limit(cur, 3)
- for player in three_players:
- print(f'id:{player[0]}, coins:{player[1]}, goods:{player[2]}')
+ ```shell
+ cp .env.example .env
+ ```
+2. Copy and paste the corresponding connection string into the `.env` file. The example result is as follows:
-def trade_example() -> None:
- with get_connection(autocommit=False) as conn:
- with conn.cursor() as cur:
- # create two players
- # player 1: id is "1", has only 100 coins.
- # player 2: id is "2", has 114514 coins, and 20 goods.
- create_player(cur, ("1", 100, 0))
- create_player(cur, ("2", 114514, 20))
- conn.commit()
+ ```dotenv
+ TIDB_HOST='{tidb_server_host}'
+ TIDB_PORT='4000'
+ TIDB_USER='root'
+ TIDB_PASSWORD='{password}'
+ TIDB_DB_NAME='test'
+ ```
- # player 1 wants to buy 10 goods from player 2.
- # it will cost 500 coins, but player 1 cannot afford it.
- # so this trade will fail, and nobody will lose their coins or goods
- trade(conn, sell_id="2", buy_id="1", amount=10, price=500)
+ Be sure to replace the placeholders `{}` with the connection parameters, and remove the `CA_PATH` line. If you are running TiDB locally, the default host address is `127.0.0.1`, and the password is empty.
- # then player 1 has to reduce the incoming quantity to 2.
- # this trade will be successful
- trade(conn, sell_id="2", buy_id="1", amount=2, price=100)
+3. Save the `.env` file.
- # let's take a look for player 1 and player 2 currently
- with conn.cursor() as cur:
- _, player1_coin, player1_goods = get_player(cur, "1")
- print(f'id:1, coins:{player1_coin}, goods:{player1_goods}')
- _, player2_coin, player2_goods = get_player(cur, "2")
- print(f'id:2, coins:{player2_coin}, goods:{player2_goods}')
-
-
-simple_example()
-trade_example()
-```
+
+
-The driver has a lower level of encapsulation than ORM, so there are a lot of SQL statements in the program. Unlike ORM, there is no data object in drivers, so the `Player` queried by the driver is represented as a tuple.
+### Step 4: Run the code and check the result
-For more information about how to use MySQL Connector/Python, refer to [MySQL Connector/Python documentation](https://dev.mysql.com/doc/connector-python/en/).
+1. Execute the following command to run the sample code:
-## Step 3. Run the code
+ ```shell
+ python mysql_connector_example.py
+ ```
-The following content introduces how to run the code step by step.
+2. Check the [Expected-Output.txt](https://github.com/tidb-samples/tidb-python-mysqlconnector-quickstart/blob/main/Expected-Output.txt) to see if the output matches.
-### Step 3.1 Initialize table
+## Sample code snippets
-Before running the code, you need to initialize the table manually. If you are using a local TiDB cluster, you can run the following command:
+You can refer to the following sample code snippets to complete your own application development.
-