There’s always a hope that in the future, our code will be better. Eventually, we won’t be dealing with piles of krufty legacy code and unprepared programmers and business users who don’t understand how clicking works. It’s 2020: we officially live in the future. Things aren’t better.
Duane works in Go, and has a piping hot “Representative Line” written in 2020. If, like me, you don’t quite know Go, it still looks pretty terrible at first glance:
db.Raw("update backlog set id = ? where id = ?;", job_id, job_id).Row()
The SQL query is… a head scratcher, for sure. id
is the primary key in this case, and as a general rule, updating the primary key in a relational database is not a good idea: it is the identity of the record, and if it’s used in relationships you can have weird cascading failures. But it’s okay in this case, since we’re setting the id
equal to job_id
where id
already equals job_id
, which gives us a nice NOP.
Theoretically, this might cause some triggers to fire, but that’s it’s own WTF.
There are other problems here, if you know a little bit about Go. First, db
is a “GORM” object- Go’s ORM layer. If you just want to update a single object, using the ORM layer directly is probably cleaner and more readable. But if you do want to execute raw SQL that returns no results, like an update, the correct method to use is Exec
, not Raw
. Raw
+ Row
is used when you intend to capture the results.
Duane adds: “The return result from Row() isn’t assigned to a variable. So this line ignores any output that Row() might have had, including any errors.”
Duane also adds: “This particular programmer is no longer working for us for some reason.”