This looks interesting. The only db libraries I can stand are sql query builders. I have experienced way too much pain with orms over the years. They work until you have to do anything slightly complicated and they either get very difficult to use or very slow
It's easy to drop down to pure SQL in every ORM I've ever used. Meanwhile, a good ORM gives you type safe queries, and saves from having to write boilerplate for trivial CRUD.
I honestly would like to know which ORMs most critics have experience with. If it's something terrible like Hibernate, then no wonder. For reference, the ORM I've used the most is Entity Framework (the new one, rewritten for NET Core), and it's simply wonderful for 90%+ of my work, and doesn't get in the way for the rest of it.
Type safe sql is a feature of most every production quality db library I’ve used going back 20 years. You don’t need the complexity of an orm to get that.
As for trivial boilerplate, I tend to find that trivial boilerplate no more troubling than any of the other compromises orms require, whether that’s polluting my data model with sql concerns or making me conform to db practices that aren’t correct for my needs.
And I’ve got extensive experience with orm going back a long time, including Entity Framework (which is a good orm that I’d still prefer not to use).
I still find myself having the experience of having to unit test trivialities with direct SQL coding, lest I miss a typo, which is a (very basic) thing any ORM or query wrapper will tend to save me from.
Yes ORM let me write plain SQL. But most time I find painful is the session management inside ORM. When does it decides to flush the query, and how it terminates an idle connection. In async mode, how does it add locks? When I try to customize the connection pool, and then all pain drives me away from ORM.
Modern ORMs like Drizzle and Prisma can probably generate more safe and efficient SQL queries than you could write by hand in a fourth of the time and effort
Drizzle is much closer to a classic sql builder than an orm. At least in my case the trouble with ORMs is mostly in the concept itself. Mapping sql results into objects defined as part of a business model.
Just generating sql from native code is not an orm.
You just gave me flashbacks to my first job out of college. It was this giant mess of hibernate with a combination of custom SQL queries mixed with the ORM that was responsible for billing data in the billions.
This does look like it's a little bit better than a lot of the other options in the Go ecosystem for database access, but this introduction misses something important: what SQL dialects does this support? It appears to be partly a wrapper around Squirrel. Squirrel is not new (and apparently also no longer being updated) but I actually have no idea which and how much of each SQL dialect Squirrel supports.
Every time I see SQL and Go stuff, I feel literally obligated to introduce people to sqlc. That said, sqlc only has good support for PostgreSQL, and you'd have to generate code for each dialect... so that's something worth considering. (I still find it to be one of my favorite SQL tools, even with its issues.)
I used sqlc with sqlite. The support seems fine there.
In general, sqlc is very nice to use. It works well out of the box with a standard config. You can also override a lot of things.
One of the nice extras about sqlc is that it doesn't feel like a real dependency.
You don't actually include sqlc anywhere. You just use a config and the cli to generate Go code that relies on the std library. The generated code is very straight forward std Go code that you could write by hand.
A couple of reasons to use Go in a project would be great support for IO, stability, great tooling, low operational complexity and minimal dependencies. sqlc fits nicely in there.
i like xo's approach https://github.com/xo/xo but it is as is. I would love if something similar comes along that is used by db practititoners that is actively used and supported.