func (b *sqlBuilder) QueryRow(query interface{}, args ...interface{}) (*sql.Row, error) { switch q := query.(type) { case *exql.Statement: return b.sess.StatementQueryRow(q, args...) case string: return b.sess.StatementQueryRow(exql.RawSQL(q), args...) case db.RawValue: return b.QueryRow(q.Raw(), q.Arguments()...) default: return nil, fmt.Errorf("Unsupported query type %T.", query) } }
// FindTablePrimaryKeys allows sqladapter find a table's primary keys. func (d *database) FindTablePrimaryKeys(tableName string) ([]string, error) { pk := make([]string, 0, 1) stmt := exql.RawSQL(fmt.Sprintf("PRAGMA TABLE_INFO('%s')", tableName)) rows, err := d.Query(stmt) if err != nil { return nil, err } columns := []struct { Name string `db:"name"` PK int `db:"pk"` }{} if err := sqlbuilder.NewIterator(rows).All(&columns); err != nil { return nil, err } maxValue := -1 for _, column := range columns { if column.PK > 0 && column.PK > maxValue { maxValue = column.PK } } if maxValue > 0 { for _, column := range columns { if column.PK > 0 { pk = append(pk, column.Name) } } } return pk, nil }