extractobject

package
v1.0.10 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 3, 2026 License: GPL-3.0 Imports: 16 Imported by: 0

README

extractObject - SQL表名提取工具

这是一个独立的SQL表名提取工具,可以从SQL语句中提取表名、数据库名、模式名和别名信息。

功能特性

  • 支持多种数据库类型:MySQL、PostgreSQL、Oracle、SQL Server、TiDB、MariaDB、OceanBase、Snowflake
  • 提取完整的表信息:数据库名、模式名、表名、别名、是否为CTE临时表
  • 简单易用的API接口和命令行工具
  • 基于成熟的SQL解析器(来自Bytebase项目)
  • 命令行参数支持小写格式,更符合Unix惯例

快速开始

命令行工具
# 编译工具
cd cmd
go build -o extractobject main.go

# 使用小写参数(推荐)
./extractobject -dbtype mysql -sql "SELECT * FROM users"
./extractobject -dbtype postgres -file query.sql
./extractobject -dbtype oracle -sql "SELECT * FROM hr.employees" -json
./extractobject -dbtype sqlserver -file query.sql

# 也支持大写参数(向后兼容)
./extractobject -dbtype MYSQL -sql "SELECT * FROM users"
Go API 使用
package main

import (
    "fmt"
    "log"
    
    extractor "github.com/tianyuso/advisorTool/extractObject"
)

func main() {
    // 定义SQL语句
    sql := `
        SELECT u.id, u.name, o.order_id
        FROM mydb.users AS u
        JOIN orders o ON u.id = o.user_id
        WHERE u.status = 'active'
    `
    
    // 提取表名
    tables, err := extractor.ExtractTables(extractor.MySQL, sql)
    if err != nil {
        log.Fatal(err)
    }
    
    // 打印结果
    for _, table := range tables {
        fmt.Printf("数据库: %s, 模式: %s, 表名: %s, 别名: %s\n",
            table.DBName, table.Schema, table.TBName, table.Alias)
    }
}
输出示例
数据库: mydb, 模式: , 表名: users, 别名: u
数据库: , 模式: , 表名: orders, 别名: o

命令行工具

安装
cd cmd
go build -o extractobject main.go
使用方法
# 基本用法
./extractobject -dbtype <数据库类型> -sql "<SQL语句>"
./extractobject -dbtype <数据库类型> -file <SQL文件路径>

# JSON输出
./extractobject -dbtype <数据库类型> -sql "<SQL语句>" -json

# 查看版本
./extractobject -version
支持的数据库类型
数据库 参数(推荐) 别名支持
MySQL mysql MYSQL, MySQL
PostgreSQL postgres postgresql, POSTGRES, POSTGRESQL
Oracle oracle ORACLE, Oracle
SQL Server sqlserver SQLSERVER, SQLServer, mssql, MSSQL
TiDB tidb TIDB, TiDB
MariaDB mariadb MARIADB, MariaDB
OceanBase oceanbase OCEANBASE, OceanBase
命令行示例
# MySQL
./extractobject -dbtype mysql -sql "SELECT u.id FROM mydb.users u"

# PostgreSQL
./extractobject -dbtype postgres -file query.sql

# Oracle - JSON输出
./extractobject -dbtype oracle -sql "SELECT * FROM hr.employees" -json

# SQL Server
./extractobject -dbtype sqlserver -file complex_query.sql

API说明

ExtractTables
func ExtractTables(dbType DBType, sql string) ([]TableInfo, error)

从SQL语句中提取表名信息。

参数:

  • dbType: 数据库类型,可选值:
    • MySQL
    • PostgreSQL
    • Oracle
    • SQLServer
    • TiDB
    • MariaDB
    • OceanBase
    • Snowflake
  • sql: 要解析的SQL语句

返回:

  • []TableInfo: 表信息列表
  • error: 错误信息
ExtractTablesWithContext
func ExtractTablesWithContext(ctx context.Context, dbType DBType, sql string) ([]TableInfo, error)

带上下文的表名提取函数,支持超时控制和取消操作。

TableInfo 结构
type TableInfo struct {
    DBName string // 数据库名
    Schema string // 模式名
    TBName string // 表名
    Alias  string // 别名
    IsCTE  bool   // 是否是CTE临时表
}

支持的数据库类型

Go API 常量

在 Go 代码中使用以下常量:

extractor.MySQL       // MySQL / MariaDB / OceanBase
extractor.PostgreSQL  // PostgreSQL
extractor.Oracle      // Oracle
extractor.SQLServer   // SQL Server
extractor.TiDB        // TiDB
extractor.MariaDB     // MariaDB
extractor.OceanBase   // OceanBase
字符串解析

如果需要从字符串解析数据库类型,使用 ParseDBType 函数:

dbType, err := extractor.ParseDBType("mysql")  // 支持大小写不敏感
if err != nil {
    log.Fatal(err)
}
tables, err := extractor.ExtractTables(dbType, sql)

支持的SQL语句类型

  • SELECT查询
  • INSERT语句
  • UPDATE语句
  • DELETE语句
  • JOIN操作
  • 子查询
  • CTE(公用表表达式)

使用示例

MySQL示例
sql := `
    SELECT u.id, u.name, o.order_id
    FROM mydb.users AS u
    JOIN orders o ON u.id = o.user_id
`
tables, _ := extractor.ExtractTables(extractor.MySQL, sql)
// 输出: mydb.users (u), orders (o)
PostgreSQL示例
sql := `
    SELECT p.product_name, c.category_name
    FROM public.products p
    INNER JOIN public.categories c ON p.category_id = c.id
`
tables, _ := extractor.ExtractTables(extractor.PostgreSQL, sql)
// 输出: public.products (p), public.categories (c)
SQL Server示例
sql := `
    SELECT e.employee_id, d.department_name
    FROM HRDatabase.dbo.employees AS e
    LEFT JOIN HRDatabase.dbo.departments d ON e.dept_id = d.id
`
tables, _ := extractor.ExtractTables(extractor.SQLServer, sql)
// 输出: HRDatabase.dbo.employees (e), HRDatabase.dbo.departments (d)
Oracle示例
sql := `
    SELECT e.emp_id, d.dept_name
    FROM hr.employees e, hr.departments d
    WHERE e.dept_id = d.dept_id
`
tables, _ := extractor.ExtractTables(extractor.Oracle, sql)
// 输出: hr.employees (e), hr.departments (d)

注意事项

  1. 不同数据库的完全限定表名格式不同:

    • MySQL: database.table
    • PostgreSQL: schema.tabledatabase.schema.table
    • SQL Server: database.schema.tableserver.database.schema.table
    • Oracle: schema.table
  2. 如果表名中没有指定数据库或模式,相应字段将为空字符串

  3. 别名是可选的,如果SQL中没有指定别名,Alias字段将为空字符串

依赖

本工具依赖以下解析库:

  • MySQL/MariaDB/OceanBase: github.com/bytebase/parser/mysql
  • PostgreSQL: github.com/bytebase/parser/postgresql
  • Oracle: github.com/bytebase/parser/plsql
  • SQL Server: github.com/bytebase/parser/tsql
  • TiDB: github.com/pingcap/tidb/parser (通过MySQL解析器)
  • Snowflake: github.com/bytebase/parser/snowflake

许可证

本项目基于Bytebase SQL解析引擎,继承其开源许可证。

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Example

func Example()

Example 展示如何使用extractObject包提取SQL中的表名

Types

type DBType

type DBType string

DBType 数据库类型

const (
	MySQL      DBType = "mysql"
	PostgreSQL DBType = "postgres"
	Oracle     DBType = "oracle"
	SQLServer  DBType = "sqlserver"
	TiDB       DBType = "tidb"
	MariaDB    DBType = "mariadb"
	OceanBase  DBType = "oceanbase"
	Snowflake  DBType = "snowflake"
)

func ParseDBType

func ParseDBType(s string) (DBType, error)

ParseDBType 解析数据库类型字符串,支持大小写不敏感

func (DBType) String

func (d DBType) String() string

type Extractor

type Extractor interface {
	Extract(ctx context.Context, sql string) ([]TableInfo, error)
}

Extractor SQL表名提取器接口

type MySQLExtractor

type MySQLExtractor struct{}

MySQLExtractor MySQL表名提取器

func (*MySQLExtractor) Extract

func (e *MySQLExtractor) Extract(ctx context.Context, sql string) ([]TableInfo, error)

Extract 从MySQL SQL语句中提取表名

type OracleExtractor

type OracleExtractor struct{}

OracleExtractor Oracle表名提取器

func (*OracleExtractor) Extract

func (e *OracleExtractor) Extract(ctx context.Context, sql string) ([]TableInfo, error)

Extract 从Oracle SQL语句中提取表名

type PostgreSQLExtractor

type PostgreSQLExtractor struct{}

PostgreSQLExtractor PostgreSQL表名提取器

func (*PostgreSQLExtractor) Extract

func (e *PostgreSQLExtractor) Extract(ctx context.Context, sql string) ([]TableInfo, error)

Extract 从PostgreSQL SQL语句中提取表名

type SQLServerExtractor

type SQLServerExtractor struct{}

SQLServerExtractor SQL Server表名提取器

func (*SQLServerExtractor) Extract

func (e *SQLServerExtractor) Extract(ctx context.Context, sql string) ([]TableInfo, error)

Extract 从SQL Server SQL语句中提取表名

type SnowflakeExtractor

type SnowflakeExtractor struct{}

SnowflakeExtractor Snowflake表名提取器

func (*SnowflakeExtractor) Extract

func (e *SnowflakeExtractor) Extract(ctx context.Context, sql string) ([]TableInfo, error)

Extract 从Snowflake SQL语句中提取表名

type TableInfo

type TableInfo struct {
	DBName string // 数据库名
	Schema string // 模式名
	TBName string // 表名
	Alias  string // 别名
	IsCTE  bool   // 是否是CTE临时表
}

TableInfo 表示从SQL语句中提取的表信息

func ExtractTables

func ExtractTables(dbType DBType, sql string) ([]TableInfo, error)

ExtractTables 从SQL语句中提取表名信息 dbType: 数据库类型 sql: SQL语句 返回: 表信息列表和错误

func ExtractTablesWithContext

func ExtractTablesWithContext(ctx context.Context, dbType DBType, sql string) ([]TableInfo, error)

ExtractTablesWithContext 从SQL语句中提取表名信息(带上下文)

type TiDBExtractor

type TiDBExtractor struct {
	MySQLExtractor
}

TiDBExtractor TiDB表名提取器 TiDB使用MySQL兼容语法,所以直接复用MySQLExtractor

func (*TiDBExtractor) Extract

func (e *TiDBExtractor) Extract(ctx context.Context, sql string) ([]TableInfo, error)

Extract 从TiDB SQL语句中提取表名

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL