You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ballerina中正确配置config.toml实现MySQL连接?

解决Ballerina连接MySQL的配置与代码问题

核心问题分析

你的错误主要来自两个关键点:

  1. 配置变量与config.toml键名大小写不匹配:Ballerina的configurable变量对大小写敏感,你的变量用大写(如HOST)但toml里用小写(如host),导致配置无法加载。
  2. MySQL客户端构造函数参数顺序错误:你传入的参数顺序不符合mysql:Client的要求,导致连接参数传递错误。

正确的config.toml配置

保持键名与代码中的configurable变量完全大小写一致,推荐使用小写符合Toml惯例:

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

# 可选:添加连接超时等高级配置
[connectionOptions]
connectTimeout = 30000  # 30秒连接超时,单位毫秒

修正后的Ballerina代码

关键修正点:

  1. 恢复MySQL驱动导入(必须,否则无法加载驱动)
  2. 统一配置变量名与toml键名的大小写
  3. 修正mysql:Client构造函数的参数顺序(正确顺序:host, port, username, password, database)
  4. 补充缺失的数据类型定义(否则编译报错)
  5. 调整查询语句的列名映射,匹配record字段
import ballerinax/mysql;
import ballerina/sql;
import ballerinax/mysql.driver as _;

// 配置变量(与config.toml键名大小写完全匹配)
configurable string host = ?;
configurable int port = ?;
configurable string username = ?;
configurable string password = ?;
configurable string database = ?;

// 可选连接配置
configurable mysql:Options & readonly connectionOptions = {
    connectTimeout: 30000
};

// 初始化MySQL客户端(参数顺序正确)
mysql:Client|sql:Error dbClientResult = new (host, port, username, password, database, connectionOptions);

// 确保客户端初始化成功
final mysql:Client dbClient = check dbClientResult;

// 定义数据类型(必须补充,否则编译失败)
type User record {
    int userId;
    string email;
    string password;
    time:DateTime createdAt;
    time:DateTime updatedAt;
};

type Chat record {
    int chatId;
    int userId;
    string role;
    string text;
    string? img;
    time:DateTime createdAt;
};

type UserChat record {
    int id;
    int userId;
    int chatId;
    string title;
    time:DateTime createdAt;
};

# 插入新用户
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);
}

# 根据ID查询用户
isolated function selectUserById(int id) returns User|sql:Error {
    sql:ParameterizedQuery selectQuery = `SELECT id AS userId, email, password, createdAt, updatedAt FROM users WHERE id = ${id}`;
    return dbClient->queryRow(selectQuery);
}

# 根据邮箱查询用户(登录用)
isolated function selectUserByEmail(string email) returns User|sql:Error {
    sql:ParameterizedQuery selectQuery = `SELECT id AS userId, email, password, createdAt, updatedAt FROM users WHERE email = ${email}`;
    return dbClient->queryRow(selectQuery);
}

# 插入新对话
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);
}

# 根据ID和用户ID查询对话
isolated function selectChatByIdAndUser(int id, int userId) returns Chat|sql:Error {
    sql:ParameterizedQuery selectQuery = `SELECT id AS chatId, userId, role, text, img, createdAt FROM chats WHERE id = ${id} AND userId = ${userId}`;
    return dbClient->queryRow(selectQuery);
}

# 查询用户所有对话
isolated function selectChatsByUserId(int userId) returns Chat[]|error {
    sql:ParameterizedQuery selectQuery = `SELECT id AS chatId, userId, role, text, img, createdAt FROM chats WHERE userId = ${userId}`;
    stream<Chat, error?> chatStream = dbClient->query(selectQuery);
    return from Chat chat in chatStream select chat;
}

# 插入新用户对话关联记录
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);
}

# 查询用户所有对话关联记录
isolated function selectUserChatsByUserId(int userId) returns UserChat[]|error {
    sql:ParameterizedQuery selectQuery = `SELECT id, userId, chatId, title, createdAt FROM user_chats WHERE userId = ${userId}`;
    stream<UserChat, error?> userChatStream = dbClient->query(selectQuery);
    return from UserChat userChat in userChatStream select userChat;
}

额外错误排查步骤

如果仍然报错,执行以下操作:

  • 确认MySQL服务正在运行,端口3306未被防火墙拦截
  • 验证root用户拥有localhost访问权限,密码正确
  • 确认testdb数据库已创建,且用户有权限操作
  • 用bal run --log-level DEBUG运行项目,查看详细日志定位具体错误

内容的提问来源于stack exchange,提问作者Adithya Bandara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:10:58