Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

feat: Introduce sqlc.optional for dynamic query generation#4005

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Open
copito wants to merge1 commit intosqlc-dev:main
base:main
Choose a base branch
Loading
fromcopito:feat/sqlc-optional

Conversation

copito
Copy link

This commit introduces thesqlc.optional feature, allowing conditional inclusion of SQL query fragments at runtime.

Key changes:

  1. Parser Enhancement: The SQL parser now recognizessqlc.optional('ConditionKey', 'SQLFragment') syntax within query files. This information is stored in the query's metadata.

  2. Code Generation:

    • Go code generation logic has been updated to process theseOptionalBlocks.
    • Generated Go functions now include new parameters (typed asinterface{}) corresponding to eachConditionKey.
    • Templates (stdlib/queryCode.tmpl,pgx/queryCode.tmpl) were modified to dynamically build the SQL query string and its arguments at runtime. If an optional Go parameter is non-nil, its associated SQL fragment is included in the final query, and its value is added to the list of database arguments.
  3. Parameter Handling:$N placeholders in all SQL fragments (base or optional) consistently refer to the Nth parameter in the generated Go function's signature.

  4. Documentation: Added comprehensive documentation forsqlc.optional indocs/reference/query-annotations.md, covering syntax, behavior, parameter numbering, and examples.

  5. Examples: A new runnable example has been added toexamples/dynamic_query/postgresql/ to demonstrate practical usage.

  6. Tests: New end-to-end tests were added ininternal/endtoend/testdata/dynamic_query/ for bothstdlib andpgx drivers, ensuring the correctness of the generated code.

pimmerks reacted with thumbs up emoji
This commit introduces the `sqlc.optional` feature, allowing conditional inclusion of SQL query fragments at runtime.Key changes:1.  **Parser Enhancement**: The SQL parser now recognizes `sqlc.optional('ConditionKey', 'SQLFragment')` syntax within query files. This information is stored in the query's metadata.2.  **Code Generation**:    - Go code generation logic has been updated to process these `OptionalBlocks`.    - Generated Go functions now include new parameters (typed as `interface{}`) corresponding to each `ConditionKey`.    - Templates (`stdlib/queryCode.tmpl`, `pgx/queryCode.tmpl`) were modified to dynamically build the SQL query string and its arguments at runtime. If an optional Go parameter is non-nil, its associated SQL fragment is included in the final query, and its value is added to the list of database arguments.3.  **Parameter Handling**: `$N` placeholders in all SQL fragments (base or optional) consistently refer to the Nth parameter in the generated Go function's signature.4.  **Documentation**: Added comprehensive documentation for `sqlc.optional` in `docs/reference/query-annotations.md`, covering syntax, behavior, parameter numbering, and examples.5.  **Examples**: A new runnable example has been added to `examples/dynamic_query/postgresql/` to demonstrate practical usage.6.  **Tests**: New end-to-end tests were added in `internal/endtoend/testdata/dynamic_query/` for both `stdlib` and `pgx` drivers, ensuring the correctness of the generated code.
@dosubotdosubotbot added size:XXLThis PR changes 1000+ lines, ignoring generated files. 🔧 golang labelsJun 29, 2025
@ororsatti
Copy link

ororsatti commentedJun 29, 2025
edited
Loading

Just a comment, but maybe the optional types can be something like NullString ?

typexxxOptionalstruct {Xxx*<type>Validbool}

This way it won't have to be interface{} when ever you wanna use a optional value.

mukhlasr and brandur reacted with thumbs up emoji

Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Reviewers
No reviews
Assignees
No one assigned
Labels
size:XXLThis PR changes 1000+ lines, ignoring generated files.🔧 golang
Projects
None yet
Milestone
No milestone
Development

Successfully merging this pull request may close these issues.

2 participants
@copito@ororsatti

[8]ページ先頭

©2009-2025 Movatter.jp