Skip to content
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 our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Option to Segregate Read and Write queries to have separate db users with each type of query. #3187

Open
K-odesome opened this issue Feb 7, 2024 · 4 comments
Labels
enhancement New feature or request

Comments

@K-odesome
Copy link

K-odesome commented Feb 7, 2024

What do you want to change?

Usecase is to have seperate set of queries generated for read access and write access.
For example if I have read user of Mysql , I will not be able to prepare the update , insert statement from it because sqlc generates everything in one compiled list of queries.

The solution is to generate two separate prepared folder but then it would result in lot of code duplication of models also getting generated.

Can we have a solution where we can get the objects in separate set of queries which could be used to prepare from corresponding db users.

Current Behaviour :


-- name: SelectTable
Select * from table;

-- name: InsertTable
Insert into Table values (1,2,3);

output generated from it

type Queries struct {
	db                                DBTX
	tx                                *sql.Tx
	selectTable  *sql.Stmt
	insertTable      *sql.Stmt
}

Now I cant use this Queries struct with my read db user and it fails during the prepare method call becase the queries have both select and insert queries.

Feature request : On generate command it should generate something like

type ReadQueries struct {
	selectTable  *sql.Stmt
}
type WriteQueries struct {
	insertTable  *sql.Stmt
}

and these corresponding queries can be used with corresponding mysql db users context while preparing.

What database engines need to be changed?

PostgreSQL, MySQL, SQLite

What programming language backends need to be changed?

Go

@K-odesome K-odesome added enhancement New feature or request triage New issues that hasn't been reviewed labels Feb 7, 2024
@kyleconroy kyleconroy removed the triage New issues that hasn't been reviewed label Mar 4, 2024
@kyleconroy
Copy link
Collaborator

It's an interesting idea. We've kicked around generating different interfaces for reader and writers, but that wouldn't solve your issue as you're preparing the queries before hand. The best I can offer right now is moving the read-only queries into a separate query file and create two different packages.

@K-odesome
Copy link
Author

K-odesome commented Mar 4, 2024

@kyleconroy , we currently thought of doing what you suggested , but It is resulting in lot of code duplication in terms of models that we being generated.

@jarri-abidi
Copy link

suggestion for slight improvement:

type ReadQueries struct {
	...
	selectTable  *sql.Stmt
}

type Queries struct {
	...
	selectTable  *sql.Stmt
	insertTable  *sql.Stmt
}

this would maintain backwards compatibility and can be treated as an optional flag in the config to generate read-only queries

@jarri-abidi
Copy link

@kyleconroy can we merge PR #3291 to support this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants