Golang工具:将结构体转换为SQL表的实现方法

Golang工具:将结构体转换为SQL表的实现方法 大家好,我编写了一个工具,可以将 Go 结构体转换为 SQL 查询,该查询将创建一个包含结构体字段的表。这是第一个版本,我确实计划在未来改进它。它是用 100% 的 JavaScript 编写的,因为这非常适合这项任务。

附言:我在谷歌上搜索了类似工具后编写了这个工具,它与 PostgreSQL 配合使用效果最佳。

你可以在这里找到它:https://cheikhshift.github.io/struct-to-sql/

源代码在这里:https://github.com/cheikhshift/struct-to-sql

3 回复

考虑到我们身处“Golang Bridge”论坛,我可能带有偏见,但我认为Javascript几乎不是这项任务的理想选择 😂

无论如何,这是一个很好的概念验证。我建议:

  1. 使用一个真正的Go语法解析器: 你的代码假设Go结构体名称在一行,每个字段在随后的每一行,直到遇到最后的闭合}。如果你的输入Go代码有语法错误,或者没有按照当前gofmt实现进行格式化,它将无法产生正确的输出。例如:

    type Struct1 struct {
    type Struct2 struct {
        S string
        I int
    }
    
  2. 代码没有为PostgreSQL生成最优化的类型。 例如,结构体中的一个byte字段不应该在PostgreSQL中变成VARCHAR。它应该是char(1)bytea

  3. 添加对PostgreSQL以外数据库的支持, 例如MySQL、SQLite3、Microsoft SQL Server等。

  4. 添加对不同命名约定的支持。 并非每个人都使用“蛇形命名法”,有些人可能希望使用此代码来针对预先存在的第三方数据库生成SQL查询。


免责声明

我碰巧正在开发我自己的从Go结构体定义生成SQL的工具,所以,或许我对这个有点“挑剔”!

更多关于Golang工具:将结构体转换为SQL表的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


如果你想使用Go语法解析器,或许可以考虑使用WASM:

Medium图标

通过构建图像转ASCII转换器入门WebAssembly和Go

文章缩略图

这篇博客阐述了如何将你现有的Go代码导入到Wasm,并在浏览器中运行。在这篇博客中,我将向你展示如何……

阅读时间:8分钟

我非常欣赏不向服务器回传任何数据的理念。Matt Holt出色的curl转gojson转go工具不会向服务器发送任何数据,因此我可以放心使用它们,无需担心隐私问题。所以,在我看来,让这一切100%在浏览器中运行是最理想的方式。

总之,这是一个很棒的开端。许多成功的开源项目都是这样开始的:有人为了解决自己遇到的问题而创建了一个解决方案。请继续努力!

这是一个非常实用的工具,特别是对于需要快速从Go结构体生成数据库表结构的开发者来说。不过,考虑到你提到这是用JavaScript编写的,而社区中其实已经存在一些成熟的、用Go语言原生实现的类似工具,它们可能更符合Golang开发者的工作流。下面我介绍两个主流的Go原生方案,并附上示例代码。

1. 使用GORM的AutoMigrate功能

GORM是Go中最流行的ORM库之一,其AutoMigrate方法能自动根据结构体创建或更新表结构。

package main

import (
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

type User struct {
    ID        uint   `gorm:"primaryKey"`
    Name      string `gorm:"type:varchar(100);not null"`
    Email     string `gorm:"type:varchar(255);uniqueIndex"`
    Age       int
    IsActive  bool   `gorm:"default:true"`
    CreatedAt time.Time
}

func main() {
    dsn := "host=localhost user=postgres password=secret dbname=test port=5432 sslmode=disable"
    db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
    
    // 自动迁移,创建或更新表结构
    err = db.AutoMigrate(&User{})
    if err != nil {
        panic("failed to migrate database")
    }
}

2. 使用sqlc的SQL DDL生成

sqlc是一个通过SQL生成类型安全Go代码的工具,虽然主要面向查询,但可以配合其模式定义生成表结构。

首先创建schema.sql

CREATE TABLE users (
    id         BIGSERIAL PRIMARY KEY,
    name       VARCHAR(100) NOT NULL,
    email      VARCHAR(255) UNIQUE,
    age        INT,
    is_active  BOOLEAN DEFAULT true,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

然后配置sqlc.yaml

version: "2"
sql:
  - schema: "schema.sql"
    queries: "queries/"
    engine: "postgresql"
    gen:
      go:
        package: "db"
        out: "db/"

运行sqlc generate将生成对应的Go结构体。

3. 纯SQL生成工具:goverter

虽然主要用作转换器,但goverter的模式生成功能也可借鉴:

//go:generate goverter ./converter
package main

type User struct {
    ID        int64
    Name      string
    Email     string
}

// 生成对应的SQL创建语句
func (u User) ToSQL() string {
    return `CREATE TABLE users (
        id BIGINT PRIMARY KEY,
        name TEXT NOT NULL,
        email TEXT UNIQUE
    );`
}

对比总结:

  • 你的工具:作为Web工具方便快速验证,适合前端或全栈开发者。
  • GORM AutoMigrate:适合Go项目集成,支持数据库版本管理。
  • sqlc:强调类型安全,从SQL schema生成Go代码。
  • 纯代码生成:更灵活,可定制DDL逻辑。

如果你的工具能添加对GORM标签的支持(如gorm:"type:varchar(100)"),并支持导出为Go migration文件(如使用golang-migrate格式),对Go开发者会更有吸引力。现有的JavaScript实现作为原型验证很有价值,但长期来看,用Go重写核心逻辑可能更容易被Go社区采纳。

回到顶部