Forráskód Böngészése

Check if constraint exists before trying to delete

Tulir Asokan 5 éve
szülő
commit
6a42de73d1
1 módosított fájl, 13 hozzáadás és 7 törlés
  1. 13 7
      database/upgrades/2019-05-16-message-delete-cascade.go

+ 13 - 7
database/upgrades/2019-05-16-message-delete-cascade.go

@@ -10,15 +10,21 @@ func init() {
 			// SQLite doesn't support constraint updates, but it isn't that careful with constraints anyway.
 			return nil
 		}
-		_, err := tx.Exec("ALTER TABLE message DROP CONSTRAINT message_chat_jid_fkey")
-		if err != nil {
-			return nil
-		}
-		_, err = tx.Exec(`ALTER TABLE message ADD CONSTRAINT message_chat_jid_fkey
+		res, _ := tx.Query(`SELECT EXISTS(SELECT constraint_name FROM information_schema.table_constraints
+			WHERE table_name='message' AND constraint_name='message_chat_jid_fkey');`)
+		var exists bool
+		_ = res.Scan(&exists)
+		if exists {
+			_, err := tx.Exec("ALTER TABLE message DROP CONSTRAINT IF EXISTS message_chat_jid_fkey")
+			if err != nil {
+				return err
+			}
+			_, err = tx.Exec(`ALTER TABLE message ADD CONSTRAINT message_chat_jid_fkey
 				FOREIGN KEY (chat_jid, chat_receiver) REFERENCES portal(jid, receiver)
 				ON DELETE CASCADE`)
-		if err != nil {
-			return err
+			if err != nil {
+				return err
+			}
 		}
 		return nil
 	}}