Go SQL connector не даст мне результат специального запроса select

#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 (с пользователем / паролем, используемым вашим приложением) и запустите тот же запрос.