Skip to content

Support for custom models #755

Open
Open

Description

@mlukasik-dev

Example:

db/queries/roles.sql

-- name: ListRolesWithPermissions :many
-- model: Roles
-- path: internal/domain/roles
SELECT
  r.role_id,
  r.display_name,
  r.description,
  array_agg(permissions.method)::text[] AS permissions
  FROM roles r
    LEFT JOIN permissions USING (role_id)
GROUP BY r.role_id;

-- name ListRoles :many
-- model: Roles
-- path: internal/domain/roles
SELECT  role_id, display_name, description FROM roles; /* returned colums exists in the model so we can reuse it */

It isn't generated file!
internal/domain/roles

type Role struct {
	RoleID      uuid.UUID // here we can add some custom struct tags and methods
	DisplayName string
	Description string
	Permissions []sql.NullString // using []string throws an error if an array is empty 
}

Generated method

func (q *Queries) ListRoles(ctx context.Context) ([]roles.Role, error)

P.S. These features can be useful because with it we can both use sqlc and follow Clean Architecture. And reuse structs for tables for complex queries with joins.

So my question is if I'd correctly implement this functionality would you approve PR (I'm asking because this feature can be not in the spirit of the project)

Activity

  1. mlukasik-dev commented on Nov 1, 2020

    @mlukasik-dev
    Author

    This feature could help solving issues like: #185 , #534 , #658

  2. jonleopard commented on Dec 2, 2020

    @jonleopard

    Would also love this! I use sqlx and frequently use tags like db:"user_id" json:"id" or json:"password_confirm" validate:"eqfield=Password"

  3. Jille commented on Jul 26, 2023

    @Jille
    Contributor

    I agree this would be useful. Especially when you have a few queries with different WHERE clauses that return the same columns.

    This proposal has one big question: How would we verify that the given struct matches the data types returned from the query?

    • Do we assert they match exactly with the types sqlc would've chosen? That'd be safe, but I think a bunch of people here are expecting to use this to override exactly that? Also, if the types match 1:1, Go would allow you to cast it anyway.
    • If we allow uncheck structs, wouldn't that defeat one of sqlc's USPs: That you don't have runtime failures for type mismatches.

    Would love to hear your thoughts on this.

  4. jamesleeht commented on Aug 2, 2023

    @jamesleeht

    Also very interested in this feature.

    Here are some other closely related issues: #387 #444

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions