title | summary |
---|---|
Connect to TiDB with node-mysql2 |
Learn how to connect to TiDB using node-mysql2. This tutorial gives Node.js sample code snippets that work with TiDB using node-mysql2. |
TiDB is a MySQL-compatible database, and node-mysql2 is a fast mysqljs/mysql compatible MySQL driver for Node.js.
In this tutorial, you can learn how to use TiDB and node-mysql2 to accomplish the following tasks:
- Set up your environment.
- Connect to your TiDB cluster using node-mysql2.
- Build and run your application. Optionally, you can find sample code snippets for basic CRUD operations.
To complete this tutorial, you need:
If you don't have a TiDB cluster, you can create one as follows:
- (Recommended) Follow Creating a TiDB Cloud Starter cluster to create your own TiDB Cloud cluster.
- Follow Deploy a local test TiDB cluster or Deploy a production TiDB cluster to create a local cluster.
- (Recommended) Follow Creating a TiDB Cloud Starter cluster to create your own TiDB Cloud cluster.
- Follow Deploy a local test TiDB cluster or Deploy a production TiDB cluster to create a local cluster.
This section demonstrates how to run the sample application code and connect to TiDB.
Run the following commands in your terminal window to clone the sample code repository:
git clone https://github.com/tidb-samples/tidb-nodejs-mysql2-quickstart.git
cd tidb-nodejs-mysql2-quickstart
Run the following command to install the required packages (including mysql2
and dotenv
) for the sample app:
npm install
Install dependencies to existing project
For your existing project, run the following command to install the packages:
npm install mysql2 dotenv --save
Connect to your TiDB cluster depending on the TiDB deployment option you've selected.
-
Navigate to the Clusters page, and then click the name of your target cluster to go to its overview page.
-
Click Connect in the upper-right corner. A connection dialog is displayed.
-
Ensure the configurations in the connection dialog match your operating environment.
- Connection Type is set to
Public
. - Branch is set to
main
. - Connect With is set to
General
. - Operating System matches the operating system where you run the application.
- Connection Type is set to
-
If you have not set a password yet, click Generate Password to generate a random password.
-
Run the following command to copy
.env.example
and rename it to.env
:cp .env.example .env
-
Edit the
.env
file, set up the environment variables as follows, replace the corresponding placeholders{}
with connection parameters on the connection dialog:TIDB_HOST={host} TIDB_PORT=4000 TIDB_USER={user} TIDB_PASSWORD={password} TIDB_DATABASE=test TIDB_ENABLE_SSL=true
Note
For TiDB Cloud Starter, TLS connection MUST be enabled via
TIDB_ENABLE_SSL
when using public endpoint. -
Save the
.env
file.
Run the following command to execute the sample code:
npm start
If the connection is successful, the console will output the version of the TiDB cluster as follows:
🔌 Connected to TiDB cluster! (TiDB version: 8.0.11-TiDB-v8.1.2)
⏳ Loading sample game data...
✅ Loaded sample game data.
🆕 Created a new player with ID 12.
ℹ️ Got Player 12: Player { id: 12, coins: 100, goods: 100 }
🔢 Added 50 coins and 50 goods to player 12, updated 1 row.
🚮 Deleted 1 player data.
You can refer to the following sample code snippets to complete your own application development.
For complete sample code and how to run it, check out the tidb-samples/tidb-nodejs-mysql2-quickstart repository.
The following code establishes a connection to TiDB with options defined in the environment variables:
// Step 1. Import the 'mysql' and 'dotenv' packages.
import { createConnection } from "mysql2/promise";
import dotenv from "dotenv";
import * as fs from "fs";
// Step 2. Load environment variables from .env file to process.env.
dotenv.config();
async function main() {
// Step 3. Create a connection to the TiDB cluster.
const options = {
host: process.env.TIDB_HOST || '127.0.0.1',
port: process.env.TIDB_PORT || 4000,
user: process.env.TIDB_USER || 'root',
password: process.env.TIDB_PASSWORD || '',
database: process.env.TIDB_DATABASE || 'test',
ssl: process.env.TIDB_ENABLE_SSL === 'true' ? {
minVersion: 'TLSv1.2',
ca: process.env.TIDB_CA_PATH ? fs.readFileSync(process.env.TIDB_CA_PATH) : undefined
} : null,
}
const conn = await createConnection(options);
// Step 4. Perform some SQL operations...
// Step 5. Close the connection.
await conn.end();
}
void main();
Note
For TiDB Cloud Starter, you MUST enable TLS connection via
TIDB_ENABLE_SSL
when using public endpoint. However, you don't have to specify an SSL CA certificate viaTIDB_CA_PATH
, because Node.js uses the built-in Mozilla CA certificate by default, which is trusted by TiDB Cloud Starter.
The following query creates a single Player
record and returns a ResultSetHeader
object:
const [rsh] = await conn.query('INSERT INTO players (coins, goods) VALUES (?, ?);', [100, 100]);
console.log(rsh.insertId);
For more information, refer to Insert data.
The following query returns a single Player
record by ID 1
:
const [rows] = await conn.query('SELECT id, coins, goods FROM players WHERE id = ?;', [1]);
console.log(rows[0]);
For more information, refer to Query data.
The following query adds 50
coins and 50
goods to the Player
with ID 1
:
const [rsh] = await conn.query(
'UPDATE players SET coins = coins + ?, goods = goods + ? WHERE id = ?;',
[50, 50, 1]
);
console.log(rsh.affectedRows);
For more information, refer to Update data.
The following query deletes the Player
record with ID 1
:
const [rsh] = await conn.query('DELETE FROM players WHERE id = ?;', [1]);
console.log(rsh.affectedRows);
For more information, refer to Delete data.
- Using connection pools to manage database connections can reduce the performance overhead caused by frequently establishing and destroying connections.
- To avoid SQL injection, it is recommended to use prepared statements.
- In scenarios where there are not many complex SQL statements involved, using ORM frameworks like Sequelize, TypeORM, or Prisma can greatly improve development efficiency.
- It is recommended to enable the
supportBigNumbers: true
option when dealing with big numbers (BIGINT
andDECIMAL
columns) in the database. - It is recommended to enable the
enableKeepAlive: true
option to avoid socket errorread ECONNRESET
due to network problems. (Related issue: sidorares/node-mysql2#683)
- Learn more usage of node-mysql2 driver from the documentation of node-mysql2.
- Learn the best practices for TiDB application development with the chapters in the Developer guide, such as: Insert data, Update data, Delete data, Query data, Transactions, SQL performance optimization.
- Learn through the professional TiDB developer courses and earn TiDB certifications after passing the exam.
Ask the community on Discord or Slack, or submit a support ticket.
Ask the community on Discord or Slack, or submit a support ticket.