我正在开发一个 Ballerina 项目,需要连接到 MySQL 数据库。我用它config.toml来存储 MySQL 连接详细信息,但我不确定正确的格式和所需字段。

以下是我迄今为止尝试过的方法config.toml

host = "localhost"
port = 3306
username = "root"
password = "password"
database = "testdb"

在我的 Ballerina 服务中,我正在加载这些配置来初始化 MySQL 客户端,但我一直遇到诸如Invalid database configuration或 之类的错误Connection timeout

有人可以指导我如何正确配置config.tomlBallerina 中 MySQL 连接的文件,以及如何在 Ballerina 代码中使用这些配置来建立成功的连接吗?

这是我的db.bal。我尝试了这些方法,但得到了上述错误

import ballerinax/mysql;
import ballerina/sql;
// import ballerinax/mysql.driver as _;

// Configurable variables
configurable string HOST = ?;
configurable int PORT = ?;
configurable string USERNAME = ?;
configurable string PASSWORD = ?;
configurable string DATABASE = ?;

// Client options configuration (if needed)
configurable mysql:Options & readonly connectionOptions = {};

// Initialize the MySQL client
mysql:Client|sql:Error dbClientResult = new (HOST, USERNAME, PASSWORD, DATABASE, PORT);

// Ensure dbClient is correctly initialized
 final mysql:Client dbClient = check dbClientResult;

# Insert a new user into the database
isolated function insertUser(User entry) returns sql:ExecutionResult|error {
    User {userId, email, password, createdAt, updatedAt} = entry;
    sql:ParameterizedQuery insertQuery = `INSERT INTO users (id, email, password, createdAt, updatedAt) 
                                          VALUES (${userId}, ${email}, ${password}, ${createdAt}, ${updatedAt})`;
    return dbClient->execute(insertQuery);
}

# Select a user by ID
isolated function selectUserById(int id) returns User|sql:Error {
    sql:ParameterizedQuery selectQuery = `SELECT * FROM users WHERE id = ${id}`;
    return dbClient->queryRow(selectQuery);
}

# Select a user by email (for login)
isolated function selectUserByEmail(string email) returns User|sql:Error {
    sql:ParameterizedQuery selectQuery = `SELECT * FROM users WHERE email = ${email}`;
    return dbClient->queryRow(selectQuery);
}

# Insert a new chat into the database
isolated function insertChat(Chat entry) returns sql:ExecutionResult|error {
    Chat {chatId, userId, role, text, img, createdAt} = entry;
    sql:ParameterizedQuery insertQuery = `INSERT INTO chats (id, userId, role, text, img, createdAt) 
                                          VALUES (${chatId}, ${userId}, ${role}, ${text}, ${img}, ${createdAt})`;
    return dbClient->execute(insertQuery);
}

# Select a chat by ID and userId
isolated function selectChatByIdAndUser(int id, int userId) returns Chat|sql:Error {
    sql:ParameterizedQuery selectQuery = `SELECT * FROM chats WHERE id = ${id} AND userId = ${userId}`;
    return dbClient->queryRow(selectQuery);
}

# Select all chats for a user
isolated function selectChatsByUserId(int userId) returns Chat[]|error {
    sql:ParameterizedQuery selectQuery = `SELECT * FROM chats WHERE userId = ${userId}`;
    stream<Chat, error?> chatStream = dbClient->query(selectQuery);
    return from Chat chat in chatStream select chat;
}

# Insert a new user chat entry into the database
isolated function insertUserChat(UserChat entry) returns sql:ExecutionResult|error {
    UserChat {id, userId, chatId, title, createdAt} = entry;
    sql:ParameterizedQuery insertQuery = `INSERT INTO user_chats (id, userId, chatId, title, createdAt) 
                                          VALUES (${id}, ${userId}, ${chatId}, ${title}, ${createdAt})`;
    return dbClient->execute(insertQuery);
}

# Select all user chats by userId
isolated function selectUserChatsByUserId(int userId) returns UserChat[]|error {
    sql:ParameterizedQuery selectQuery = `SELECT * FROM user_chats WHERE userId = ${userId}`;
    stream<UserChat, error?> userChatStream = dbClient->query(selectQuery);
    return from UserChat userChat in userChatStream select userChat;
}

我正在使用:

  • 芭蕾舞女演员版本:2201.10.0(天鹅湖更新10)

任何帮助或可行的示例都将不胜感激!

1

  • 1
    请不要发布完全相同的问题。


    – 


最佳答案
2

您的代码中存在几个问题。

  1. 您需要mysql.driver导入,因为没有驱动程序您无法连接到 MySQL 数据库。
  2. 您的配置变量和中的值Config.bal不同。这些是区分大小写的,您应该遵循这一点。使用这个Config.toml可以解决这个问题:

    HOST = "localhost"
    PORT = 3306
    USERNAME = "root"
    PASSWORD = "password"
    DATABASE = "testdb"
    

您可以查看来了解有关 Ballerina 配置的更多信息。

4

  • 我已经这样做了但仍然显示这些错误


    – 

  • 在您最初分享的屏幕截图中,似乎有一些与解析 TOML 内容相关的警告。您可以先尝试解决它们以确保 TOML 内容正确,然后再尝试运行程序吗?


    – 


  • @AdithyaBandara 您能展示一下修复这些问题后出现了什么错误吗?


    – 

  • 我明白了谢谢你的支持


    – 


确保您有一个在本地运行的 MySQL 数据库。

  1. mysql -h localhost -P 3306 -u root -p
  2. 输入通行证
  3. 执行USE testdb;