mirror of
https://github.com/ManyakRus/crud_generator.git
synced 2024-12-22 00:36:41 +02:00
100 lines
2.3 KiB
Go
100 lines
2.3 KiB
Go
package schema
|
|
|
|
import (
|
|
"database/sql"
|
|
)
|
|
|
|
// TODO(js) Should we be filtering out system tables, like we currently do?
|
|
|
|
const postgresAllColumns = `SELECT * FROM %s LIMIT 0`
|
|
|
|
const postgresTableNamesWithSchema = `
|
|
SELECT
|
|
table_schema,
|
|
table_name
|
|
FROM
|
|
information_schema.tables
|
|
WHERE
|
|
table_type = 'BASE TABLE' AND
|
|
table_schema NOT IN ('pg_catalog', 'information_schema')
|
|
ORDER BY
|
|
table_schema,
|
|
table_name
|
|
`
|
|
|
|
const postgresViewNamesWithSchema = `
|
|
SELECT
|
|
table_schema,
|
|
table_name
|
|
FROM
|
|
information_schema.tables
|
|
WHERE
|
|
table_type = 'VIEW' AND
|
|
table_schema NOT IN ('pg_catalog', 'information_schema')
|
|
ORDER BY
|
|
table_schema,
|
|
table_name
|
|
`
|
|
|
|
const postgresPrimaryKey = `
|
|
SELECT
|
|
kcu.column_name
|
|
FROM
|
|
information_schema.table_constraints tco
|
|
JOIN
|
|
information_schema.key_column_usage kcu
|
|
ON kcu.constraint_name = tco.constraint_name AND
|
|
kcu.constraint_schema = tco.constraint_schema AND
|
|
kcu.constraint_name = tco.constraint_name
|
|
WHERE
|
|
tco.constraint_type = 'PRIMARY KEY' AND
|
|
kcu.table_schema = current_schema() AND
|
|
kcu.table_name = $1
|
|
ORDER BY
|
|
kcu.ordinal_position
|
|
`
|
|
|
|
const postgresPrimaryKeyWithSchema = `
|
|
SELECT
|
|
kcu.column_name
|
|
FROM
|
|
information_schema.table_constraints tco
|
|
JOIN
|
|
information_schema.key_column_usage kcu
|
|
ON kcu.constraint_name = tco.constraint_name AND
|
|
kcu.constraint_schema = tco.constraint_schema AND
|
|
kcu.constraint_name = tco.constraint_name
|
|
WHERE
|
|
tco.constraint_type = 'PRIMARY KEY' AND
|
|
kcu.table_schema = $1 AND
|
|
kcu.table_name = $2
|
|
ORDER BY
|
|
kcu.ordinal_position
|
|
`
|
|
|
|
type postgresDialect struct{}
|
|
|
|
func (postgresDialect) escapeIdent(ident string) string {
|
|
// "tablename"
|
|
return escapeWithDoubleQuotes(ident)
|
|
}
|
|
|
|
func (d postgresDialect) ColumnTypes(db *sql.DB, schema, name string) ([]*sql.ColumnType, error) {
|
|
return fetchColumnTypes(db, postgresAllColumns, schema, name, d.escapeIdent)
|
|
}
|
|
|
|
func (postgresDialect) PrimaryKey(db *sql.DB, schema, name string) ([]string, error) {
|
|
if schema == "" {
|
|
return fetchNames(db, postgresPrimaryKey, "", name)
|
|
}
|
|
return fetchNames(db, postgresPrimaryKeyWithSchema, schema, name)
|
|
}
|
|
|
|
func (postgresDialect) TableNames(db *sql.DB) ([][2]string, error) {
|
|
return fetchObjectNames(db, postgresTableNamesWithSchema)
|
|
}
|
|
|
|
func (postgresDialect) ViewNames(db *sql.DB) ([][2]string, error) {
|
|
return fetchObjectNames(db, postgresViewNamesWithSchema)
|
|
}
|