package db import ( "database/sql" "fmt" _ "modernc.org/sqlite" ) func openSQLite(c ConnReq) (*sql.DB, error) { path := c.Database if path == "" { path = c.Host } if path == "" { return nil, fmt.Errorf("SQLite 需要 database 填文件路径") } return sql.Open("sqlite", path) } func listDatabasesSQLite(_ *sql.DB) ([]string, error) { return []string{"main"}, nil } func listTablesSQLite(db *sql.DB, _ string) ([]string, error) { rows, err := db.Query(`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY 1`) if err != nil { return nil, err } defer rows.Close() out := []string{} for rows.Next() { var name string if err := rows.Scan(&name); err != nil { return nil, err } out = append(out, name) } return out, rows.Err() } func listColumnsSQLite(dbh *sql.DB, _, table string) ([]ColumnInfo, error) { rows, err := dbh.Query(`PRAGMA table_info(` + quotePGIdent(table) + `)`) if err != nil { return nil, err } defer rows.Close() var out []ColumnInfo for rows.Next() { var cid int var name, typ string var notnull, pk int var def sql.NullString if err := rows.Scan(&cid, &name, &typ, ¬null, &def, &pk); err != nil { return nil, err } col := ColumnInfo{Name: name, Type: typ, Nullable: notnull == 0} if pk > 0 { col.Key = "PRI" } if def.Valid { col.Default = def.String } out = append(out, col) } if out == nil { out = []ColumnInfo{} } return out, rows.Err() }