特定数据库方言配置
2025年7月7日大约 5 分钟
特定数据库方言配置
本文档详细介绍特定数据库方言配置文件(如mysql.toml、oracle.toml等)的结构和内容。
配置文件位置
特定数据库方言配置文件位于系统的以下目录:
/data/jdbc/每种数据库方言对应一个独立的TOML格式配置文件,文件名为该数据库的标识符,如mysql.toml、oracle.toml等。
配置文件结构
特定数据库方言配置文件包含以下几个主要部分:
- 数据库版本配置
- JDBC连接配置
- JDBC URL属性
- 数据类型映射
- 元数据查询
- SQL模板
- 数据库特性
- 数据库函数映射
- 日期格式映射
1. 数据库版本配置
某些数据库(如Oracle)支持多个版本的配置,通过在配置文件顶部定义支持的版本列表:
# 支持的数据库版本列表
versions = [12, 11]对于特定版本的配置,可以使用版本号作为前缀,例如:
# 版本11特有的JDBC配置
[11.jdbc]
url = "jdbc:oracle:thin:@{host}:{port}/{databaseName}"
calciteDialect = "org.apache.calcite.sql.HeTuOracle11Dialect"
# 版本11特有的SQL模板
[11.template]
limit = """SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( {sql} ) TMP WHERE ROWNUM <= ({offset} + {limit})) WHERE ROW_ID > {offset}"""系统会根据连接的数据库版本自动选择对应的配置。如果某个版本没有特定配置,则使用默认配置。
2. JDBC连接配置 [jdbc]
这部分定义了与数据库建立连接所需的基本参数:
[jdbc]
driverClass = "com.mysql.cj.jdbc.Driver" # JDBC驱动类
validationQuery = "SELECT 1" # 连接验证查询
urlPrefix = "jdbc:mysql" # JDBC URL前缀
hibernateDialect = "org.hibernate.dialect.MySQLDialect" # Hibernate方言类
calciteDialect = "org.apache.calcite.sql.dialect.HeTuMySqlDialect" # Calcite方言类
url = "jdbc:mysql://{host}:{port}/{databaseName}" # JDBC URL模板属性说明:
driverClass:JDBC驱动类的全限定名validationQuery:用于验证数据库连接是否有效的SQL查询urlPrefix:JDBC URL的前缀hibernateDialect:Hibernate ORM框架使用的方言类calciteDialect:Calcite查询引擎使用的方言类url:JDBC连接URL模板,其中的{host}、{port}、{databaseName}等占位符会在运行时被实际值替换
3. JDBC URL属性 [jdbc.urlProperties]
这部分定义了JDBC连接URL中的额外参数:
[jdbc.urlProperties]
useSSL = "false"
allowPublicKeyRetrieval = "false"
serverTimezone = "Asia/Shanghai"
characterEncoding = "utf-8"
rewriteBatchedStatements = "true"这些属性会被添加到JDBC URL中,形如:jdbc:mysql://host:port/dbname?useSSL=false&serverTimezone=Asia/Shanghai
4. 数据类型映射 [type.XXX]
这部分定义了JDBC类型与数据库特定类型之间的映射关系:
[type.VARCHAR]
expr = "VARCHAR({length})"
length = { min = 0, max = 65535 }
id = 12
description = "字符串类型,最大长度65535"
[type.LONGVARCHAR]
expr = "longtext"
id = -1
length = { min = 0, max = 100000 }
description = "长字符串类型"
[type.INTEGER]
id = 4
expr = "INTEGER"
length = { min = 0, max = 2147483647 }
description = "整形"属性说明:
expr:数据库特定的类型表达式,可包含{length}占位符length:类型长度范围,包含min和max属性id:对应的JDBC类型ID(来自java.sql.Types)description:类型描述
5. 元数据查询 [metadata]
这部分定义了用于获取数据库元数据(如表、列信息等)的SQL查询:
[metadata]
schema = "SELECT DATABASE()"
catalog = "SELECT DATABASE()"
# 查询表字段
column = """SELECT
COLUMN_NAME AS columnName,
DATA_TYPE AS columnType,
CHARACTER_MAXIMUM_LENGTH AS columnLength,
NUMERIC_PRECISION AS columnPrecision,
NUMERIC_SCALE AS columnScale,
CASE WHEN UPPER(IS_NULLABLE) = 'YES' THEN 1 ELSE 0 END AS isNullable,
CASE WHEN COLUMN_KEY = 'PRI' THEN 1 ELSE 0 END AS isPrimaryKey,
COLUMN_DEFAULT AS defaultValue,
COLUMN_COMMENT AS remark,
ORDINAL_POSITION AS orderNo
FROM information_schema.COLUMNS
WHERE UPPER(TABLE_SCHEMA) = upper('{schema}') AND UPPER(TABLE_NAME)=UPPER('{tableName}')
ORDER BY ORDINAL_POSITION ASC"""
# 查询所有表
tables = "SELECT table_name AS tableName, table_comment AS comment FROM information_schema.TABLES WHERE upper(table_schema) = upper('{schema}') AND table_type = 'BASE TABLE'"属性说明:
schema:获取当前schema的SQL查询catalog:获取当前catalog的SQL查询column:获取表字段信息的SQL查询,包含字段名、类型、长度、精度、是否可空等信息tables:获取所有表信息的SQL查询
这些查询中的{schema}、{catalog}、{tableName}等占位符会在运行时被实际值替换。
6. SQL模板 [template]
这部分定义了各种SQL操作的模板,用于生成特定数据库的SQL语句:
[template]
# 分页
limit = "{sql} LIMIT {limit} OFFSET {offset}"
# 表注释语句
tableComment = """tableComment(tableName, comment) ::= <<
COMMENT ON TABLE {tableName} IS '{comment}';
>>"""
# 字段注释语句
columnComment = """columnComment(columns, tableName ) ::= <<
{columns:{c |COMMENT ON COLUMN {tableName}.{c.columnName} IS '{c.remark}';}; separator="
"}
>>"""属性说明:
limit:分页查询模板tableComment:表注释SQL模板columnComment:列注释SQL模板notNullExpr:非空约束表达式defaultExpr:默认值表达式addComment:是否添加注释createTable:建表语句模板
这些模板使用StringTemplate模板引擎语法,可以包含条件判断和循环等逻辑。
7. 数据库特性 [characteristic]
这部分定义了数据库的特性和行为:
[characteristic]
# 支持隐式类型转换
implicitTypeConversion = true
# 字符串字面量的引号字符
literalQuote = "'"
# 标识符(如表名、列名等)的引用字符串
identifierQuote = "`"属性说明:
implicitTypeConversion:是否支持隐式类型转换literalQuote:字符串字面量使用的引号字符identifierQuote:标识符(表名、列名等)使用的引用字符
8. 数据库函数映射 [function]
这部分定义了标准SQL函数到特定数据库函数的映射关系:
[function]
LENGTH = "LENGTH({str})"
CONCAT = "{str1}||{str2}||..."
SUBSTR = "SUBSTR({str}, {pos}, {len})"
SUBSTRING = "SUBSTR({str}, {pos}, {len})"
TRIM = "TRIM({str})"
DATE_FORMAT = "TO_CHAR({date}, {format})"
YEAR = "EXTRACT(YEAR FROM {date})"
QUARTER = "TO_CHAR({date}, 'Q')"
MONTH = "EXTRACT(MONTH FROM {date})"
WEEK = "TO_CHAR({date}, 'WW')"
DAY = "EXTRACT(DAY FROM {date})"
DATE_ADD.YEAR = "{date} + INTERVAL '{expr}' YEAR"
DATE_ADD.MONTH = "ADD_MONTHS({date}, {expr})"
DATE_ADD.DAY = "{date} + INTERVAL '{expr}' DAY"
TIMESTAMPDIFF.YEAR = "TRUNC(MONTHS_BETWEEN({datetime_expr2}, {datetime_expr1}) / 12)"
TIMESTAMPDIFF.MONTH = "MONTHS_BETWEEN({datetime_expr2}, {datetime_expr1})"
TIMESTAMPDIFF.DAY = "{datetime_expr2} - {datetime_expr1}"
CURDATE = "TRUNC(SYSDATE)"
CURTIME = "TO_CHAR(SYSDATE, 'HH24:MI:SS')"
NOW = "SYSDATE"
CEILING = "CEIL({X})"
RAND = "DBMS_RANDOM.VALUE"
SUM = "SUM({expr})"
AVG = "AVG({expr})"
COUNT = "COUNT({expr})"
MIN = "MIN({expr})"
MAX = "MAX({expr})"
MEDIAN = "MEDIAN({expr})"
STDDEV = "STDDEV({expr})"
VARIANCE = "VAR_POP({expr})"
IF = "CASE WHEN {expr1} THEN {expr2} ELSE {expr3} END"
NULLIF = "NULLIF({expr1}, {expr2})"
CAST.CHAR = "TO_CHAR({expr})"
CAST.INT = "TO_NUMBER({expr})"
CAST.DECIMAL = "TO_NUMBER({expr})"
STR_TO_DATE.DATE = "TO_DATE({str},{format})"
STR_TO_DATE.TIMESTAMP = "TO_TIMESTAMP({str},{format})"属性说明:
- 每个键值对表示一个函数映射,键是标准SQL函数名,值是数据库特定的函数实现
- 函数参数使用花括号
{}表示,如{str}、{date}等 - 对于有子类型的函数(如
DATE_ADD、CAST等),使用点号分隔,如DATE_ADD.YEAR
9. 日期格式映射 [format]
这部分定义了标准日期格式到数据库特定日期格式的映射:
[format]
YY = { expr = "YYYY" }
yy = { expr = "YY" }
Q = { expr = "Q" }
mm = { expr = "MM" }
U = { expr = "IW" }
d = { expr = "DD" }
H = { expr = "hh24" }
h = { expr = "hh" }
i = { expr = "mi" }
s = { expr = "ss" }属性说明:
- 每个键值对表示一个日期格式映射,键是标准格式,值是数据库特定的格式
expr:数据库特定的日期格式表达式
