"UPDATE table_name SET w = $1, x = $2, z = $4 WHERE y = $3 RETURNING *",

does not do the same as

"UPDATE table_name SET w = $1, x = $2, y = $3, z = $4 RETURNING *",

It’s 2 am and my mind blanked out the WHERE, and just wanted the numbers neatly in order of 1234.

idiot.

FML.

110 points
*

This is a hard lesson to learn. From now on, my guess is you will have dozens of backups.

permalink
report
reply
66 points

And a development environment. And not touch production without running the exact code at least once and being well slept.

permalink
report
parent
reply
9 points

Fuck that, get shit housed and still do it right. That’s a pro.

permalink
report
parent
reply
19 points

That’s not pro, that’s just reckless gambling.

permalink
report
parent
reply
0 points
*

Replied hastily, but the way to run db statements in prod while dealing with sleep deprivation and drinking too much is to run it a bunch in several test env scenarios so you’re just copy pasting to prod and it CAN confidently be done. Also enable transactions and determine several, valid smoke tests.

Edit: a -> several

permalink
report
parent
reply
28 points

And always use a transaction so you’re required to commit to make it permanent. See an unexpected result? Rollback.

permalink
report
parent
reply
11 points

Transactions aren’t backups. You can just as easily commit before fully realizing it. Backups, backups, backups.

permalink
report
parent
reply
20 points

Yes, but

  1. Begin transaction
  2. Update table set x=‘oopsie’
  3. Sees 42096 rows affected
  4. Rollback

Can prevent a restore, whereas doing the update with auto commit guarantees a restore on (mostly) every error you make

permalink
report
parent
reply
3 points

Backups are for emergencies.

Transactions are for oopsies.

permalink
report
parent
reply
14 points

I’ve read something like “there are two kinds of people: those who backup and those who are about to”

permalink
report
parent
reply
2 points

This is the way

permalink
report
parent
reply
89 points

This doesn’t help you but may help others. I always run my updates and deletes as selects first, validate the results are what I want including their number and then change the select to delete, update, whatever

permalink
report
reply
23 points

I learned this one very early on in my career as a physical security engineer working with access control databases. You only do it to one customer ever. 🤷‍♂️

permalink
report
parent
reply
1 point

Same. I think it’s good to have a healthy fear/respect for updates and deletes and treat them as radioactive. Luckily by simply writing it as a select first we can easily see how many and which records will be affected.

permalink
report
parent
reply
82 points

That’s an easy one to recover from:
Simply fake your own death and become a goat herder in Guatemala.

permalink
report
reply
4 points

I still remember that time (hours ago) when “fake your own death” was the top voted recommendation for recovering from a SQL mistake.

permalink
report
parent
reply
2 points

Sign me up!

permalink
report
parent
reply
71 points

Pro tip: transactions are your friend

permalink
report
reply
22 points

Completely agree, transactions are amazing for this kind of thing. In a previous team we also had a policy of always pairing if you need to do any db surgery in prod so you have a second pair of eyes + rubber duck to explain what you’re doing.

permalink
report
parent
reply
2 points

They are - until you leave them open and go home…

permalink
report
parent
reply
2 points

Temporarily locked overnight >>> broken stuff in prod

permalink
report
parent
reply
1 point

This is the way.

permalink
report
parent
reply
50 points
*

Postgres has a useful extension, pg_safeupdate

https://github.com/eradman/pg-safeupdate

It helps reduce these possibilities by requiring a where clause for updates or deletes.
I guess if you get into a habit of adding where 1=1 to the end of your SQL, it kind of defeats the purpose.

permalink
report
reply
26 points

MySQL (and by extension, MariaDB) has an even better option:

mysql --i-am-a-dummy

permalink
report
parent
reply
6 points

Amazing! These are going in my.conf ASAP.

permalink
report
parent
reply
5 points

Transactions help more, IMO. The 1=1 becomes a real habit.

permalink
report
parent
reply

Programming

!programming@programming.dev

Create post

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person’s post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you’re posting long videos try to add in some form of tldr for those who don’t want to watch videos

Wormhole

Follow the wormhole through a path of communities !webdev@programming.dev



Community stats

  • 3.1K

    Monthly active users

  • 1.8K

    Posts

  • 30K

    Comments