Rake posts:reorder_posts dà errore `UniqueViolation`

Contesto: Sto cercando di dividere un post. Per farlo, penso di dover:

  • Creare un nuovo post nell’argomento.
  • Modificare il contenuto di entrambi i post come desidero.
  • Cambiare il proprietario del post che ho creato per farlo corrispondere all’originale.
  • Cambiare il timestamp del post che ho creato per farlo corrispondere all’originale (magari aggiungendo qualche secondo).
  • Eseguire posts:reorder_posts[topic_id] per spostare la mia risposta nella posizione corretta nell’argomento.

La prima cosa che ho provato è stata l’invocazione di posts:reorder_post, “solo per vedere”, ma è fallita:

root@discourse1-app:/var/www/discourse# rake "posts:reorder_posts[879]"
rake aborted!
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "post_timings_unique"
DETAIL:  Key (topic_id, post_number, user_id)=(879, 93, 1) already exists.
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:110:in `exec'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/rack-mini-profiler-3.0.0/lib/patches/db/pg.rb:110:in `async_exec'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/postgres/connection.rb:209:in `run'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:38:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:34:in `block in with_lock'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:34:in `with_lock'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/active_record_postgres/connection.rb:38:in `run'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/mini_sql-1.4.0/lib/mini_sql/postgres/connection.rb:181:in `exec'
/var/www/discourse/lib/tasks/posts.rake:383:in `block (3 levels) in <main>'
/var/www/discourse/lib/tasks/posts.rake:366:in `each'
/var/www/discourse/lib/tasks/posts.rake:366:in `block (2 levels) in <main>'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4.1/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activesupport-7.0.4.1/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4.1/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4.1/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
/var/www/discourse/vendor/bundle/ruby/3.1.0/gems/activerecord-7.0.4.1/lib/active_record/transactions.rb:209:in `transaction'
/var/www/discourse/lib/tasks/posts.rake:329:in `block in <main>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => posts:reorder_posts
(See full trace by running task with --trace)

Interessante notare che non vedo alcun post numerato 93 nell’argomento. Vedo 92 e 94. L’utente 1 sono io, ma i post 92 e 94 non sono miei.
In precedenza ho diviso l’argomento, quindi forse il 93 si è spostato in un altro argomento, non lo so.

1 Mi Piace

sto riscontrando lo stesso problema, stessa traccia. C’è una soluzione?

Penso che questo non sia possibile. Il numero del post verrebbe ricalcolato se un post fosse separato dall’argomento (poiché non è un ID del post ma l’ordine dei post nell’argomento). Potrebbe essere un piccolo post d’azione che non sembra un ‘vero’ post ma conta comunque come tale (anche i sussurri conterebbero, ma se stai eseguendo attività rake, immagino che tu sia un amministratore che può vederli).

Mi chiedo se eliminare il piccolo post d’azione avrebbe aiutato in questa situazione? Ti sembra che questo possa essere il problema per te @UndecidedAdmin?

2 Mi Piace

Non sono sicuro di capire cosa intendi. Non sono sicuro di cosa sia un “small action post”, anche se se si tratta di un post sulla divisione degli argomenti, sì, potrebbe essere quello il problema. Sto ricevendo questo errore:

PG::UniqueViolation: ERRORE: la violazione della chiave univoca viola il vincolo univoco “post_timings_unique” (PG::UniqueViolation)
DETTAGLIO: La chiave (topic_id, post_number, user_id)=(54, 2150, 1) esiste già.

Quando vado a quell’URL:

https://[site]/t/[slug]/54/2150

Il post è in realtà 2151, e dice “Split this topic on Dec 11, 2021”. Il post immediatamente precedente è 2143, quindi immagino che 2150 sia stato spostato in un argomento diverso, e qualche tabella abbia un riferimento errato ad esso.

1 Mi Piace

In Unable to move posts between topics - #2 by nat è stata annunciata una correzione per questo errore.

3 Mi Piace

Questo argomento è stato chiuso automaticamente 90 giorni dopo l’ultima risposta. Non sono più ammesse nuove risposte.