gas-stack/pkg/sqlgenerate/schema_parse.go
wispem-wantex 654585256c
Some checks failed
CI / release-test (push) Failing after 4s
Initial commit: create table, column and schemaparse
2025-07-04 19:42:30 -07:00

67 lines
1.9 KiB
Go

package sqlgenerate
import (
_ "embed"
"strings"
"github.com/jinzhu/inflection"
"github.com/jmoiron/sqlx"
_ "github.com/mattn/go-sqlite3"
)
func InitDB(sql_schema string) *sqlx.DB {
db := sqlx.MustOpen("sqlite3", ":memory:")
db.MustExec(sql_schema)
db.MustExec(`
create temporary view tables as
select l.schema, l.name, l.type, l.ncol, l.wr, l.strict
from sqlite_schema s
left join pragma_table_list l on s.name = l.name
where s.type = 'table';
create temporary view columns as
select tables.name as table_name,
table_info.name as column_name,
lower(table_info.type) as column_type,
"notnull",
dflt_value is not null as has_default_value,
ifnull(dflt_value, 0) dflt_value,
pk as is_primary_key,
fk."table" is not null as is_foreign_key,
ifnull(fk."table", '') as fk_target_table,
ifnull(fk."to", '') as fk_target_column
from tables
join pragma_table_info(tables.name) as table_info
left join pragma_foreign_key_list(tables.name) as fk on fk."from" = column_name;
`)
return db
}
// SchemaFromDB takes a DB connection, checks its schema metadata tables, and returns a Schema.
func SchemaFromDB(db *sqlx.DB) Schema {
return ParseSchema(db)
}
func ParseSchema(db *sqlx.DB) Schema {
ret := Schema{}
var table_list []string
err := db.Select(&table_list, `select name from tables`)
if err != nil {
panic(err)
}
for _, table_name := range table_list {
tbl := Table{TableName: table_name}
tbl.TypeName = snakeToCamel(inflection.Singular(table_name))
tbl.TypeIDName = tbl.TypeName + "ID"
tbl.VarName = strings.ToLower(string(table_name[0]))
err := db.Select(&tbl.Columns, `select * from columns where table_name = ?`, table_name)
if err != nil {
panic(err)
}
ret[tbl.TableName] = tbl
}
return ret
}