Created
April 28, 2017 10:40
-
-
Save agis/7e8cd4c7a20d037c01e663402fcad9d0 to your computer and use it in GitHub Desktop.
Get SQL count in Postgres with Go (golang)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"database/sql" | |
"fmt" | |
"log" | |
_ "github.com/lib/pq" | |
) | |
func main() { | |
var count int | |
db, err := sql.Open("postgres", "user=test password=test dbname=foo sslmode=disable") | |
if err != nil { | |
log.Fatal(err) | |
} | |
defer db.Close() | |
row := db.QueryRow("SELECT COUNT(*) FROM table_name") | |
err := row.Scan(&count) | |
if err != nil { | |
log.Fatal(err) | |
} | |
fmt.Println(count) | |
} |
what if the select statement has lots of condition?
https://www.calhoun.io/querying-for-a-single-record-using-gos-database-sql-package/
Full example of querying the results with count by where clause with order and offset:
func (s *RecordStorage) GetRecordsByQuery(record entities.Record, from *time.Time, to *time.Time, limit int, offset int) ([]*entities.Record, int, error) {
var queryBuilder strings.Builder
queryBuilder.WriteString("(schema_id = ? OR schema_name = ?)")
queryParams := []interface{}{record.SchemaID, record.SchemaName}
if record.Text != "" {
queryBuilder.WriteString(" AND text LIKE ?")
queryParams = append(queryParams, fmt.Sprintf(""%%%s%%"", record.Text))
}
if record.Kind != "" {
queryBuilder.WriteString(" AND kind = ?")
queryParams = append(queryParams, record.Kind)
}
if record.Level != "" {
queryBuilder.WriteString(" AND level = ?")
queryParams = append(queryParams, record.Level)
}
queryBuilder.WriteString("AND created_at BETWEEN %d AND %d")
queryParams = append(queryParams, from.Unix(), to.Unix())
countBuilder := queryBuilder
countParams := queryParams
queryBuilder.WriteString(" ORDER BY id DESC LIMIT ? OFFSET ?")
queryParams = append(queryParams, limit, offset)
query := fmt.Sprintf(`
SELECT
(SELECT COUNT(*) FROM records WHERE %s) AS total_count,
records.*
FROM
records
WHERE %s`, countBuilder.String(), queryBuilder.String(),
)
totalParams := append(countParams, queryParams...)
rows, err := s.db.QueryContext(s.ctx, query, totalParams...)
if err != nil {
return nil, 0, fmt.Errorf("failed querying record: %w", err)
}
var totalCount int
var lr []*entities.Record
for rows.Next() {
var dest entities.Record
err := rows.Scan(&totalCount, &dest.ID, &dest.Text, &dest.CreatedAt, &dest.SchemaName,
&dest.SchemaID, &dest.Query, &dest.Kind, &dest.GroupHash, &dest.Level, &dest.Request, &dest.Response)
if err != nil {
return nil, 0, fmt.Errorf("failed querying record: %w", err)
}
lr = append(lr, &dest)
}
return lr, totalCount, nil
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
what if the select statement has lots of condition?