跳到内容
+

连接到数据库

Toolpad Studio 允许您快速连接到任何数据库。

您可以编写自定义函数来连接到您需要的任何数据库。您可以专注于编写数据库查询,而数据获取和显示由 Toolpad Studio 处理。

连接到 MySQL

自定义函数

/resources/functions.ts 中,您可以创建一个自定义函数

import mysql from 'mysql2/promise';

async function createConnection() {
  const connection = await mysql.createConnection({
    host: process.env.MYSQL_HOST,
    port: process.env.MYSQL_PORT,
    user: process.env.MYSQL_USERNAME,
    password: process.env.MYSQL_PASSWORD,
    database: process.env.MYSQL_DATABASE,
    namedPlaceholders: true,
  });
  return connection;
}

export async function getData(order_id: number) {
  const connection = await createConnection();
  const query = `SELECT * FROM table WHERE order_id = :emailPattern`;
  const [rows] = await connection.execute(query, {
    emailPattern: order_id,
  });
  await connection.end();
  return rows;
}

如果您的查询不依赖于参数,您甚至可以使用存储在文件系统中的 .sql 文件,以便您可以保持它们的组织性

import * as fs from 'fs/promises';

export async function getData() {
  const query = await fs.readFile('./toolpad/resources/getData.sql', {
    encoding: 'utf8',
  });
  const connection = await createConnection();
  const [rows] = await connection.execute(query);
  await connection.end();
  return rows;
}

请记住,您可以通过这些自定义函数在数据库上运行任何 SQL 查询。

使用 SSH 隧道(可选)

您可以创建 SSH 隧道来连接到数据库,而不是直接连接。您可以稍微修改您的函数来实现这一点

import mysql from 'mysql2/promise';
import SSH2Promise from 'ssh2-promise';

async function createConnection() {
  const ssh = new SSH2Promise({
    host: process.env.BASTION_HOST,
    port: 22, // default port for the SSH protocol
    username: process.env.BASTION_USERNAME,
    privateKey: process.env.BASTION_SSH_KEY.replace(/\\n/g, '\n'),
  });

  const tunnel = await ssh.addTunnel({
    remoteAddr: process.env.MYSQL_HOST,
    remotePort: process.env.MYSQL_PORT,
  });

  const connection = await mysql.createConnection({
    host: 'localhost',
    port: tunnel.localPort,
    user: process.env.MYSQL_USERNAME,
    password: process.env.MYSQL_PASSWORD,
    database: process.env.MYSQL_DATABASE,
    namedPlaceholders: true,
  });

  return connection;
}

您应该在最后使用以下代码关闭隧道

await ssh.close();