18 ms·
Show HN: Godb is a simple Go ORM for PostgreSQL, MySQL, SQLite and SQL Server
- sdfjkl 10y agoTook me a moment to parse the name correctly. Perhaps GoDB would've been a better choice, although I assume naming conventions prevented that and so the second letter of the alphabet was declared a deity instead.
- ademarre 10y agoCoincidentally, something called "GodBolt" [0] is on the front page at the same time. At first glance I almost thought they were related posts. [0] https://news.ycombinator.com/item?id=13182726 https://news.ycombinator.com/item?id=13182726
- deleted 10y ago[deleted]
- mdasen 10y agoOne of the features listed is "Mapping with nested structs", but there's no example of this. Given that this would be a feature setting your project apart from many of the Go "ORMs" out there, it would be nice to have an example. Maybe something with two tables: an "authors" table and a "books" table. Then an example of getting authors each struct of which has a `[]Book` of books.
- samonzeweb 10y agoNested structs are shown in the documentation : https://godoc.org/github.com/samonzeweb/godb#hdr-Structs_mapping https://godoc.org/github.com/samonzeweb/godb#hdr-Structs_map... It's composition tool, not a relational one. Sorry.
- chrisan 10y ago> It's composition tool, not a relational one. Sorry. Isn't the R in ORM for relational?
- samonzeweb 10y ago> > It's composition tool, not a relational one. Sorry. > Isn't the R in ORM for relational? I spoke about the nested structs. You can have nested structs for something else than relational mapping. As I replied to masklinn , I was not sure how to qualify godb, and I admit that ORM is not a perfect qualifier.
- camus2 10y agoYour library is a query builder, not an ORM.
- masklinn 10y agoORM is a tool to map an object model (with which the developer interacts) onto a relational one, the R part is the one which ORMs try to hide, not the one they're trying to surface.
- camus2 10y ago> ORM is a tool to map an object model No, ORM means Object Relational Mapper. if your ORM doesn't support relations between tables, then it is not a ORM. Given a relationship between 2 tables, an ORM will at the very least fetch related records when rows from a table are loaded. > godb does not manage relationships like Active Record or Entity Framework, Godb is therefore NOT an ORM. The title is misleading. People can't just make up definitions like that. It's either an ORM or it is not. Godb looks like a simple query builder.
- masklinn 10y ago> Godb is therefore NOT an ORM. […] Godb looks like a simple query builder. Yeah I already said that: https://news.ycombinator.com/item?id=13184341 https://news.ycombinator.com/item?id=13184341
- masklinn 10y agoThat's more of a query builder than an ORM: it doesn't actually use objects and only allows for expressing SQL queries in Go. In that it is similar to LINQ or HQL or SQLAlchemy Core — at an even lower level really since things like conditions are provided as parameterised strings.
- samonzeweb 10y agoI agree, it’s a simple tool. As mentioned in the README, it’s not a full-featured ORM, but it does more than building queries as it maps Go structs with databases content (on this point I disagree as it use objects). The purpose is to be more productive than doing all this job manually. Many things can be improved, it's sill a young project. This project is initially a learning one : doing stuff to improve my skill, on my spare time. I tried to build something clean, and used it on some real data. Perhaps it could be useful for somebody else. Nothing more ;)
- masklinn 10y ago> on this point I disagree as it use objects That's a technicality, it just loads query data into objects which is what more or less every query builder does, the objects aren't involved in any of the logic. By the benchmark you use psycopg is an ORM (it really isn't, it isn't even a query builder). Don't misunderstand, I'm not saying a query builder is bad, I'm just saying this is not an ORM, and shouldn't be sold as such: it's going to disappoint people looking for ORMs like Django's or Rails's and it's going to turn off people who object to ORMs[0] but would have been interested in a query builder. Not to mention a good query builder is an excellent basis for a full-fledged ORM. [0] and there are many people who think ORMs are a terrible idea
- samonzeweb 10y agoWe agree. In fact I did not know how to qualify * exactly * godb.
- eternalban 10y ago> there are many people who think ORMs are a terrible idea Not sure about terrible but it is not a bright idea to be object centric when schema remains king. Using ORMs makes perfect sense when your domain model is canonically represented by the object tier /and/ you are reusing these (common/core) domain objects to build a multiplicity of applications.
- tkyjonathan 10y agoHow hard is it to just learn SQL?
- reitanqild 10y agoI think you misunderstand: I know SQL and actually often enjoy using it. I guess this is a common trait for Java developers. Still I often find a ORM to be a good tool on many projects.
- chongli 10y agoAnswer: not very! I don't know why people have such an aversion to it. SQL is a powerful, flexible, fun, and highly rewarding language to learn! The only substitute I'd accept is a quasiquoter that checked my SQL syntax for me at compile time.
- jerf 10y agoPowerful sorta, fun debateably, highly rewarding probably, flexible, absolutely not. By far one of the biggest reasons to use something other than raw SQL is because of SQL's near total lack of composability. Show me a valid SQL fragment that represents "the 'permission' field of the given table is set to true OR the joined-in user has the superuser flag", where the join is represented in the fragment itself such that any query I apply it to will have the requisite join added in if necessary. Then show me a fragment that represents "this email and all of its attachments". Then show me how to compose those fragments into a full query. You can't; if you're using raw SQL you have to manually interleave those things into every query you want to use them in. SQL basically mandates copy and paste as the only abstraction available, and it isn't even all that great at that since there's no such thing as scopes within a query making it easy for your copy & pasted fragments to stomp on each other's names. Some of the additional query languages might be able to do it (they could certainly do chunks of what I said), but they'd still be pretty klunky about it since they bodge it on the side, and still don't compose anywhere near as well as they could or should. Mind you, I'm not sure this library can do it either; SQL is also quite difficult to wrap around because of its structural deficiencies. Trying to hack away foundational issues at higher levels is always messy, error-prone, and still filled with the quirks that shine through.
- the_duke 10y agoThe annoying thing about ORMs in Go is that since there are no macros / annotations you either have to use code generation or reflection. Reflection is a real drag on performance.
- hacknat 10y agoIt's also a beast to debug in a large codebase.
- aleksi 10y agoBut code generation doesn't have to be painful. Consider https://gopkg.in/reform.v1 https://gopkg.in/reform.v1, for example. It generates methods for your data types and uses then to cover 80% of typical usage and also does help you when you want to use SQL. (disclosure: I'm the author)
- lenka 10y agoYeah, we use gopkg.in/reform.v1 in production. I've never had problems with code generation here. I like how it works, simple and clean. Reform has enough methods for the daily routine queries. And also it's easy to use raw SQL queries with reform if we need them.
- camus2 10y agoCode generation is always painful. It's yet another compiler add-on one has to add to a pipeline. Because now If I use your executable I have to manage your tool and its versions,it becomes yet another dependency. At least real/reified macros (that go lacks) need no third party executable . Code generation with third party tools means language fragmentation. Suddenly people add their own DSL on top of Go in form of a manifest. Suddenly Go executes instructions in comments and other horrors ...
- cyri 10y agoYes that sucks. So I have written / am writing my own code generation tool which runs only once and does not rely on any fancy instructions in comments. Ah yes ... maybe `go generate`. I hate a slow compiler.
- peterkieltyka 10y agoAlso, for others looking for a Go data layer / ORM`ish package, have a look at https://github.com/upper/db https://github.com/upper/db it's been in development for years, its used in production by many companies, and theres been a lot of work to keep it lean and powerful through lots of iteration.
- JupiterMoon 10y agoThis looks like it may be what I was looking for (well initially I wanted a bells and whistles ORM like Django's but this looks better than the other options I've evaluated).
- chisleu 10y agoAlso https://github.com/jinzhu/gorm https://github.com/jinzhu/gorm and https://goa.design/ https://goa.design/
- 0xCMP 10y agoI've had issues with gorm. I find it has quirks that bother enough for me to move away from it. I have yet to find something I'll like more than just pure sql. Goa is just for generating apis. Not for databases?
- Rapzid 10y agoHow does it compare to gorp? Been using gorp over the past month to prototype MySQL database schema and insert strategies for a performance system(final implementation might not be in Go). It's worked very well for me so far, but I'm open to alternatives. Some of the pain points are related to Go's sql interface(some of which are being addressed in go 1.8 apparently).
- LukeB42 10y agoIs there anything like this or sqlx but in C?
- knz42 10y agoDo you plan to make it work with CockroachDB?
- 0xCMP 10y agoI think that's more up to CockroachDB. They offer a postgres compatible interface so this should be usable with CockroachDB already.
- samonzeweb 10y agoI don't know CockroachDB, but if there is a Go sql driver (compatible with database/sql") and it uses standard SQL, you can write an adapter, see : https://github.com/samonzeweb/godb/tree/master/adapters https://github.com/samonzeweb/godb/tree/master/adapters
- samonzeweb 10y agoAs it was stated, godb isn't really an ORM. The README and documentation was updated. Now godb is just "a Go query builder and struct mapper". Thanks for all comments :)
- aarondl0 10y agoI'm the author of a code-generation ORM in Go (real orm, does relationships fairly robustly) https://github.com/vattle/sqlboiler https://github.com/vattle/sqlboiler and I'm curious why you needed to make another one despite something like this existing? Granted we don't support sqlite/mssql yet, but surely a PR to support it is easier than writing your own :(
- samonzeweb 10y agoThe projet started as a learning one. I made some independent and experimental component from time to time, and then glued them together, rewriting some parts, ... Why this kind of project ? Because I used Active Record (Rails), Entity Framework, played with Django ORM, ... and regretted that nothing similar exist in Go world. Instead of complaining I choose to do something, not building a full ORM by myself, but at least build something allowing me to have a better comprehension of the constraints (except of the classic "no generic"). I didn't choose to build another Go library thinking I'll build something better than others. I learned, and I got a library ;)
- aarondl0 10y agoWell, now that you're done learning I hope you'll become an sqlboiler user and maybe contribute to it to fit your use case too. Fragmentation in the sql world in Go is pretty bad right now, hence my reaction to seeing your lib, sorry for that :)
- VexorLoophole 10y agoAs someone who is writing in go for some time (still deciding if i should learn something like C or JVM-based to get better at understanding big programms), i also want to get into Databases (never really learned to code. Everything is self tought). Do i need to approach a not-language specific way to really learn the SQL concept, and if yes, where do i start? In Chatroom i always read super complex stuff about databases and meanwhile i was never able to handle a SQL Database right, because i wasnt able to wrap my head around the documentation, and used something simple like bolt (in go) for my db needs.
- sethammons 10y agoI would recommend getting familiar with using your db from the command line. If you are in MySQL or Postgres, learn the basics. selects, inserts, updates, deletes, and joins. After you have a bead on those, get used to subqueries. Learn what denormalization is (might want to do that so you can play with joins). Learn what transactions are. At this point, you are probably better than most. After that, start digging into deeper parts by going through public docs and seeing what neat functions they provide. After you know the above, you can use that SQL knowledge in any language you want when accessing the db. No need to learn a new ORM per language or anything. Also, at this point, you are likely to start understanding more about scaling systems which involve intelligently choosing indexes, replication, and sharding. Now you are on your way to Jr. DBA status :) That was my path at least. There are likely better ways.
- wangii 10y agoIsn't CQRS the future?
- jcoffland 10y agoORMs are almost always a bad idea. They add an unnecessary layer of complexity which will result in both speed and space inefficiencies. If your project is small just use SQL, it will be easier. If your project is large you will end up writing a lot of customized SQL anyway, so just use SQL. If your project is in the middle, will never become large, you won't have to support it later and you already know the ORM tool then you may benefit from ORM.
- sirclueless 10y agoIf your project cares at all about security you should at least be using some form of query builder. The bare minimum is a system that binds parameters of a query to user data without manual escaping. From there the distinction between ORMs and query builders gets fuzzy, it's more of a spectrum than a bright line. I particularly like SQLAlchemy's model of a core SQL-building library with an ORM you can use piecemeal around it.
- jcoffland 10y agoProbably every modern SQL API supports safe query construction with out a third-party query builder. Building queries with simple string concatination is a bad idea but that's not a justification for the complexity of ORM.
- xupybd 10y agoI've not really understood the gain you get out of using ORMs or query builders. Doesn't it just add a learning curve to a problem already solved by SQL? I know these are meant to decouple you from the db implementation, but don't most projects of sufficient complexity end up getting tied to one db anyway?
- zubi 10y agoI, as an author of such library, am a bit biased but still... For one, you may get massive, massive developer productivity by eliminating loads of queries. In a lot of ORMs you do things like myObject.save() instead of generating a insert/update query for the particular state of myObject without taking into consideration which fields of the object is currently set. This reason alone enough for me to use them. Second, bunch of additional functionality usually come out of the box with ORMs, such as JSON or arbitrary (de)serialization of columns, caching, logging etc which you would have to spend time on custom implementations of these otherwise. Third, like you mentioned, some allow very easy change of database vendor. Fourth, mental abstraction from the underlying data storage (you stay in your language's domain) which again contributes to the productivity. Some other benefits include not seeing large SQL strings in your code which make it more difficult to read and maintain, security and ability to easily reason about what the code intends to do. I don't want to sound arrogant (not my intention at all) but I believe those who don't understand or downright rejects the benefits of a decent ORM system are either the ones that never used one to see the productivity benefit or those who work on projects that need to squeeze the last bit of optimization. In a large enough project it is seriously pain and time consuming writing all those queries which could be elegantly avoided.
- mci 10y agoI cannot see how to build nested SELECTs with Godb.
- samonzeweb 10y agoIt's not really implemented yet. You can build nested queries, doing some extra work, but it's not elegant and will not work for any cases (especially with PostgreSQL) : https://gist.github.com/samonzeweb/b1ae3e2d1f3203ee1722ac4bd2cb95e9 https://gist.github.com/samonzeweb/b1ae3e2d1f3203ee1722ac4bd... Some work to do to add proper nested queries into godb, but for a so simple example it doesn't seem to be extremely hard.