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 接口而非具体类型,调用方不需要知道底层实现。