#sql #postgresql #go
#sql #postgresql #Вперед
Вопрос:
Я пытаюсь получить из базы данных информацию обо всех таблицах и их столбцах. К сожалению, я всегда получаю null.
Это моя функция для получения таблиц со столбцами из базы данных.
func GetTablesAndColumns(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
columns := repository.GetAllTablesWithColumns()
err := json.NewEncoder(w).Encode(columns)
errorHandler.CheckError(err)
}
func GetAllTablesWithColumns() []entity.TablesColumns {
var tablesColumns []entity.TablesColumns
results, err := server.Select("SELECT tb.table_name as TableName, c.column_name as ColumnName, c.data_type as DataType FROM INFORMATION_SCHEMA.TABLES tb left join information_schema.columns c on tb.table_name = c.table_name WHERE tb.TABLE_TYPE='BASE TABLE' and tb.table_schema = 'public';")
for results.Next() {
var tableColumn entity.TablesColumns
err = ScanTablesData(results, amp;tableColumn)
errorHandler.CheckError(err)
tablesColumns = append(tablesColumns, tableColumn)
}
return tablesColumns
}
func Select(query string) (*sql.Rows, error) {
connector = singleton.OpenConnection("postgresql")
query = strings.ToLower(query)
if !strings.Contains(query, "select") {
panic("Can't use select query to run different query")
}
results, err := connector.Query(query)
if err != nil {
panic(err.Error()) // proper error handling instead of panic in your app
}
return results, err
}
type TablesColumns struct {
TableName string `json:"tableName"`
ColumnName string `json:"columnName"`
DataType string `json:"dataType"`
}
я сделал с этим маленьким трюком:
CREATE VIEW db_tables_with_columns AS
SELECT tb.table_name as TableName, c.column_name as ColumnName, c.data_type as DataType
FROM INFORMATION_SCHEMA.TABLES tb
left join information_schema.columns c on tb.table_name = c.table_name
WHERE tb.TABLE_TYPE = 'BASE TABLE'
and tb.table_schema = 'public';
я создал представление в базе данных, и теперь все работает хорошо.
я получил объект json с данными hmm. как я могу это объяснить? что произошло?
Комментарии:
1. Когда вы говорите «Я всегда получаю null», вы имеете в виду, что
server.Select
это не возвращает результатов или вы получаете результаты, ноScanTablesData()
не заполняете поляTablesColumns
(если это так, вам нужно будет показать намScanTablesData
).2. я уверен, что сервер. Select имеет значение null, потому что я fmt. Println this — results.Next() и его значение null
3. я провел еще один тест с обычным запросом, что-то вроде -> results, ошибка : = server . Выберите («выберите * из городов») теперь fmt. Println(results.Next()) возвращает TRUE, и все работает нормально
4. я сделал это с помощью VIEW trick. Вы можете посмотреть на это? я писал об этом в основном сообщении, спасибо за ваш ответ
5. Возможно, что пользователь, к которому вы подключаетесь, не имеет доступа
INFORMATION_SCHEMA
. Попробуйте подключиться с помощьюpsql
(с пользователем / паролем, используемым вашим приложением) и запустите тот же запрос.