Repository navigation
Open
Labels
Description
Version
1.25.0
What happened?
SQLite requires a PRAGMA query to enable foreign key constraints. Unfortunately, sqlc does not seem to recognise PRAGMA as a valid query, and actually collects everything until the first query it does recognise. Let me illustrate. In the queries.sql below, there are three named PRAGMA queries followed by an INSERT. Instead of generating four query functions, sqlc actually just creates one:
const pragmaForeignKeysEnable = `-- name: PragmaForeignKeysEnable :exec
PRAGMA foreign_keys = 1;
PRAGMA foreign_keys = 0;
PRAGMA foreign_keys;
INSERT INTO jobs (
created_at,
uuid,
name,
job_type,
priority,
status,
activity,
settings,
metadata,
storage_shaman_checkout_id
)
VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
`
type PragmaForeignKeysEnableParams struct {
CreatedAt time.Time
Uuid string
Name string
JobType string
Priority int64
Status string
Activity string
Settings json.RawMessage
Metadata json.RawMessage
StorageShamanCheckoutID sql.NullString
}
// PRAGMA queries
//
// Jobs / Tasks queries
func (q *Queries) PragmaForeignKeysEnable(ctx context.Context, arg PragmaForeignKeysEnableParams) error {
_, err := q.db.ExecContext(ctx, pragmaForeignKeysEnable,
arg.CreatedAt,
arg.Uuid,
arg.Name,
arg.JobType,
arg.Priority,
arg.Status,
arg.Activity,
arg.Settings,
arg.Metadata,
arg.StorageShamanCheckoutID,
)
return err
}As you can see, instead of using -- name: ... as query boundary, sqlc groups everything together until the INSERT.
Relevant log output
No response
Database schema
CREATE TABLE jobs (
id integer NOT NULL,
created_at datetime NOT NULL,
updated_at datetime,
uuid varchar(36) UNIQUE DEFAULT '' NOT NULL,
name varchar(64) DEFAULT '' NOT NULL,
job_type varchar(32) DEFAULT '' NOT NULL,
priority smallint DEFAULT 0 NOT NULL,
status varchar(32) DEFAULT '' NOT NULL,
activity varchar(255) DEFAULT '' NOT NULL,
settings jsonb NOT NULL,
metadata jsonb NOT NULL,
delete_requested_at datetime,
storage_shaman_checkout_id varchar(255) DEFAULT '',
PRIMARY KEY (id),
)SQL queries
-- PRAGMA queries
--
-- name: PragmaForeignKeysEnable :exec
PRAGMA foreign_keys = 1;
-- name: PragmaForeignKeysDisable :exec
PRAGMA foreign_keys = 0;
-- name: PragmaForeignKeysGet :one
PRAGMA foreign_keys;
-- Jobs / Tasks queries
--
-- name: CreateJob :exec
INSERT INTO jobs (
created_at,
uuid,
name,
job_type,
priority,
status,
activity,
settings,
metadata,
storage_shaman_checkout_id
)
VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );Configuration
No response
Playground URL
What operating system are you using?
Windows
What database engines are you using?
SQLite
What type of code are you generating?
Go
Activity
kyleconroy commentedon Mar 4, 2024
#3239 will fix the queries getting combined.
[-]PRAGMA queries are not recognised, and are combined until the first recognised one[/-][+]PRAGMA queries are not recognised[/+]ErikKalkoken commentedon Apr 11, 2024
I am currently evaluating slqc for my project and stumbled over this question.
Couldn't you enable foreign key checks via options to your sqlite connection string instead of pragmas?
For example initializing your DB like this would enable foreign key support:
Would that work with slqc or am I missing something?
This assumes you are using the go-sqlite3 driver. For details can be found here: Connection String
sybrenstuvel commentedon Apr 11, 2024
This is interesting. I'm using the 'modernc' sqlite implementation, which is considerably less documented when it comes to the connection string. I can see if those connection string options work with that too.
sybrenstuvel commentedon Apr 11, 2024
Unfortunately, no, this does not work. This is the code I used to test:
ncruces commentedon Aug 5, 2024
For modernc you want:
sybrenstuvel commentedon Sep 18, 2024
Note that, even though this might work for this particular case, it's not a workaround for the general issue with
PRAGMAqueries. I also want to do aPRAGMA integrity_check;at startup of my application, which suffers from the same issue.dhinogz commentedon Sep 19, 2024
Had the same issue and ended up with this implementation using mattn:
Got it from the pocketbase library.
Here's how that project set up PRAGMA using modernc.