"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.

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
1 point

This is the way.

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
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
2 points

This is the way

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
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
6 points

Oof. Been there, done that, 0 stars; would not recommend.

permalink
report
reply
5 points

This is about the one thing where SQL is a badly designed language, and you should use a frontend that forces you to write your queries in the order (table, filter, columns) for consistency.

UPDATE table_name WHERE y = $3 SET w = $1, x = $2, z = $4 RETURNING *
FROM table_name SELECT w, x, y, z
permalink
report
reply
9 points

I get mildly mad all the time when writing SQL because I feel like it’s upside down

Instead of

select u.id. u.email, p.name
from user u
join persona p on p.user_id = u.id
where u.active = true

where the columns are referenced before they’re defined (like what is u.id? Keep reading to find out!)

it should instead be

from user u
join persona p on u.id = p.user_id
where u.active = true
select u.id, u.email, p.name

Now nothing is defined before it’s used, and you’re less likely to miss your where clause. I usually write the joins first anyway because I know what tables I care about, but don’t know which specific things I’ll want.

I can’t think of any other languages that use things before they’re defined except extremely dysfunctional JavaScript.

permalink
report
parent
reply
6 points
permalink
report
parent
reply
1 point

From the cabinet, get a cup.

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