Skip to content

Releases: sqlc-dev/sqlc

v1.18.0

27 Apr 17:51
e4b1c18
Compare
Choose a tag to compare

What's New

Remote code generation

Developed by @andrewmbenton

At its core, sqlc is powered by SQL engines, which include parsers, formatters,
analyzers and more. While our goal is to support each engine on each operating
system, it's not always possible. For example, the PostgreSQL engine does not
work on Windows.

To bridge that gap, we're announcing remote code generation, currently in
private alpha. To join the private alpha, sign up for the waitlist.

To configure remote generation, configure a cloud block in sqlc.json.

{
  "version": "2",
  "cloud": {
    "organization": "<org-id>",
    "project": "<project-id>",
  },
  ...
}

You'll also need to the SQLC_AUTH_TOKEN environment variable.

export SQLC_AUTH_TOKEN=<token>

When the cloud configuration exists, sqlc generate will default to remote
generation. If you'd like to generate code locally, pass the --no-remote
option.

sqlc generate --no-remote

Remote generation is off by default and requires an opt-in to use.

sqlc.embed

Developed by @nickjackson

Embedding allows you to reuse existing model structs in more queries, resulting
in less manual serilization work. First, imagine we have the following schema
with students and test scores.

CREATE TABLE students (
  id   bigserial PRIMARY KEY,
  name text,
  age  integer
)

CREATE TABLE test_scores (
  student_id bigint,
  score integer,
  grade text
)

We want to select the student record and the highest score they got on a test.
Here's how we'd usually do that:

-- name: HighScore :many
WITH high_scores AS (
  SELECT student_id, max(score) as high_score
  FROM test_scores
  GROUP BY 1
)
SELECT students.*, high_score::integer
FROM students
JOIN high_scores ON high_scores.student_id = students.id;

When using Go, sqlc will produce a struct like this:

type HighScoreRow struct {
	ID        int64
	Name      sql.NullString
	Age       sql.NullInt32
	HighScore int32
}

With embedding, the struct will contain a model for the table instead of a
flattened list of columns.

-- name: HighScoreEmbed :many
WITH high_scores AS (
  SELECT student_id, max(score) as high_score
  FROM test_scores
  GROUP BY 1
)
SELECT sqlc.embed(students), high_score::integer
FROM students
JOIN high_scores ON high_scores.student_id = students.id;
type HighScoreRow struct {
	Student   Student
	HighScore int32
}

sqlc.slice

Developed by Paul Cameron and Jille Timmermans

The MySQL Go driver does not support passing slices to the IN operator. The
sqlc.slice function generates a dynamic query at runtime with the correct
number of parameters.

/* name: SelectStudents :many */
SELECT * FROM students 
WHERE age IN (sqlc.slice("ages"))
func (q *Queries) SelectStudents(ctx context.Context, arges []int32) ([]Student, error) {

This feature is only supported in MySQL and cannot be used with prepared
queries.

Batch operation improvements

When using batches with pgx, the error returned when a batch is closed is
exported by the generated package. This change allows for cleaner error
handling using errors.Is.

errors.Is(err, generated_package.ErrBatchAlreadyClosed)

Previously, you would have had to check match on the error message itself.

err.Error() == "batch already closed"

The generated code for batch operations always lived in batch.go. This file
name can now be configured via the output_batch_file_name configuration
option.

Configurable query parameter limits for Go

By default, sqlc will limit Go functions to a single parameter. If a query
includes more than one parameter, the generated method will use an argument
struct instead of positional arguments. This behavior can now be changed via
the query_parameter_limit configuration option. If set to 0, every
generated method will use a argument struct.

What's Changed

Read more

v1.17.2

22 Feb 18:02
140db73
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v1.17.0...v1.17.1

v1.17.1

22 Feb 17:18
fc6ed52
Compare
Choose a tag to compare
v1.17.1 Pre-release
Pre-release

Note

This release contained a build failure for Windows and will not be released. Please see v1.17.2

What's Changed

New Contributors

Full Changelog: v1.17.0...v1.17.1

v1.17.0

14 Feb 07:14
fa985d0
Compare
Choose a tag to compare

## What's Changed

New Contributors

Full Changelog: v1.16.0...v1.17.0

v1.16.0

09 Nov 04:41
89922d4
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v1.15.0...v1.16.0

v1.15.0

07 Aug 18:14
61f1758
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v1.14.0...v1.15.0

v1.14.0

10 Jun 06:14
d20ca82
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v1.13.0...v1.14.0

v1.13.0

03 Apr 02:33
e7aa4bd
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v1.12.0...v1.13.0

v1.12.0

06 Feb 05:03
45bd150
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v1.11.0...v1.12.0

v1.11.0

24 Nov 17:20
ad53cfe
Compare
Choose a tag to compare

Bug Fixes

  • Update incorrect signatures (#1180)
  • Correct aggregate func sig (#1182)
  • Jsonb_build_object (#1211)
  • Case-insensitive identifiers (#1216)
  • Incorrect handling of meta (#1228)
  • Detect invalid INSERT expression (#1231)
  • Respect alias name for coalesce (#1232)
  • Mark nullable when casting NULL (#1233)
  • Support nullable fields in joins for MySQL engine (#1249)
  • Fix between expression handling of table references (#1268)
  • Support nullable fields in joins on same table (#1270)
  • Fix missing binds in ORDER BY (#1273)
  • Set RV for TargetList items on updates (#1252)
  • Fix MySQL parser for query without trailing semicolon (#1282)
  • Validate table alias references (#1283)
  • Add support for MySQL ON DUPLICATE KEY UPDATE (#1286)
  • Support references to columns in joined tables in UPDATE statements (#1289)
  • Add validation for GROUP BY clause column references (#1285)
  • Prevent variable redeclaration in single param conflict (#1298)
  • Use common params struct field for same named params (#1296)

Documentation

  • Replace deprecated go get with go install (#1181)
  • Fix package name referenced in tutorial (#1202)
  • Add environment variables (#1264)
  • Add go.17+ install instructions (#1280)
  • Warn about golang-migrate file order (#1302)

Features

  • Instrument compiler via runtime/trace (#1258)
  • Add MySQL support for BETWEEN arguments (#1265)

Refactor

  • Move from io/ioutil to io and os package (#1164)

Styling

  • Apply gofmt to sample code (#1261)

New Contributors

Full Changelog: v1.10.0...v1.11.0