scanner

package
v0.8.2 Latest Latest
Warning

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

Go to latest
Published: Jul 28, 2026 License: MIT Imports: 5 Imported by: 0

Documentation

Overview

Package scanner 的 MySQL 实现。

Package scanner — PostgreSQL 扫表器实现。 移植自 Java PostgreSqlTableScanner,用 information_schema 三段查询读取列/主键/表注释。

为什么用三段查询而不是一段?

PostgreSQL 把"列信息"、"约束信息"、"对象注释"存在不同的系统表/视图里:

  • information_schema.columns:列的基础属性(类型、可空、默认值等)
  • information_schema.table_constraints + key_column_usage:约束(PRIMARY KEY/UNIQUE 等)
  • pg_class + obj_description:表/对象级别注释

三段查询能各自独立失败/重试,逻辑更清晰。

Go 小白知识点:$1 占位符

PostgreSQL 驱动(如 lib/pq)要求用 $1, $2... 作为查询参数占位符。 与 MySQL 的 ? 不同,PostgreSQL 的占位符是有序编号的, 同一参数可多次引用(例如 $1 出现两次即传入同一个值两次)。

Package scanner 连接数据库读取表结构元数据。

设计思路

Java 版通过 JDBC 的 DatabaseMetaData 或直接执行 SQL 读表结构。 Go 版用标准库 database/sql 执行相同 SQL,逻辑完全对称。

接口 vs 实现

Go 接口是隐式实现(implicit interface): 只要某类型拥有接口声明的全部方法,就自动满足该接口,无需 implements 关键字。 这使得 TableScanner 可以在测试中被任意 mock 结构体替换。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type TableScanner

type TableScanner interface {
	// ScanTable 读取指定表的列信息和表注释,返回结构化元数据。
	ScanTable(table string) (model.TableMetadata, error)
}

TableScanner 扫表接口(隐式实现)。 调用方只依赖接口,不依赖具体的 mySQLScanner,便于后续扩展 PostgreSQL 实现。

func For

func For(d dialect.SqlDialect, db *sql.DB) (TableScanner, error)

For 按 SQL 方言返回对应的扫表器。

当前支持:MySQL(M1)、PostgreSQL(M3)。

Go 小白知识点:switch 语句无需 break,默认不会 fall-through(和 Java/C 不同)。 对于未知方言,走 default 分支,用 fmt.Errorf 构造带上下文信息的 error 返回。

func NewMySQL

func NewMySQL(db *sql.DB) TableScanner

NewMySQL 用一个已打开的 *sql.DB 构造 MySQL 扫表器。

返回类型是接口 TableScanner,而非具体类型 mySQLScanner, 这样调用方无法直接访问内部字段,保持良好的封装性。

func NewPostgreSQL

func NewPostgreSQL(db *sql.DB) TableScanner

NewPostgreSQL 用已打开的 *sql.DB 构造 PostgreSQL 扫表器。 返回 TableScanner 接口而非具体类型,调用方不需要知道底层实现。

Jump to

Keyboard shortcuts

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