the specified rails not migrations for create but ruby-on-rails postgresql activerecord rollback pg

ruby on rails - specified - ActiveRecord:: StatementInvalid: PG InFailedSqlTransaction



rollback migration rails (10)

En mi caso, la configuración de Postgres en /usr/local/var/postgres/postgresql.conf tenía el tipo de fecha como el formato internacional de dmy

Cambiar el tipo de fecha al formato estadounidense de mdy solucionó este problema.

Estoy intentando crear un objeto ActiveRecord. Pero estoy obteniendo este error al crearlo.

(0.1ms) ROLLBACK ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block

Cualquier persona de ideas con respecto al problema.


En mi caso, recibí este error simplemente porque no había rake''d mi prueba db.


Este problema estaba ocurriendo en mi entorno de prueba, y fue causado por el hecho de que cada prueba estaba envuelta en su propia transacción.

Estaba usando la gema database_cleaner, y la he configurado para NO incluir pruebas en una transacción si usan javascript. Entonces, para resolver el problema, agregué js: true a cada especificación que causaba este problema. (Incluso si las especificaciones no usaban javascript, esta era la forma más conveniente de asegurarse de que las pruebas no se envuelvan en una transacción. Sin embargo, estoy seguro de que hay menos formas de hacerlo).

Como referencia, aquí está la configuración de database_cleaner de spec/support/database_cleaner.rb :

RSpec.configure do |config| config.before(:suite) do DatabaseCleaner.clean_with :deletion end config.before(:each) do DatabaseCleaner.strategy = :transaction end config.before(:each, :js => true) do DatabaseCleaner.strategy = :deletion end config.before(:each) do DatabaseCleaner.start end config.after(:each) do DatabaseCleaner.clean end end

Si no está utilizando database_cleaner, entonces probablemente la razón por la que las pruebas se use_transactional_fixtures en las transacciones sería que la opción use_transactional_fixtures se establece en true en spec/spec_helper.rb . Intenta configurarlo en falso.


Me he encontrado con este error al hacer referencia a una columna en mis especificaciones que ya no existe. Asegúrese de que su base de datos esté actualizada y su código no espera una columna que no existe.


Ninguna de las otras respuestas corrige la causa raíz del problema.

El problema es que cuando Postgres plantea una excepción, envenena transacciones futuras en la misma conexión.

La solución es deshacer la transacción ofensiva:

begin ActiveRecord...do something... rescue Exception => e puts "SQL error in #{ __method__ }" ActiveRecord::Base.connection.execute ''ROLLBACK'' raise e end

Ver reference .


Problema:

  1. El programa ejecuta una declaración SQL incorrecta. La instrucción SQL incorrecta es la causa raíz del problema.
  2. El programa no ROLLBACK o RELEASE SAVEPOINT inmediatamente después de una instrucción SQL incorrecta.
  3. El programa ejecuta instrucciones SQL después de una instrucción SQL incorrecta.
  4. PostgreSQL genera ERROR: la transacción actual se cancela, los comandos se ignoran hasta el final del bloque de transacción

Solución:

Encuentra una instrucción SQL incorrecta y corrígela. Si no desea corregir la instrucción SQL, use ROLLBACK o RELEASE SAVEPOINT después de una instrucción SQL incorrecta.


Puedes ver lo que sucede realmente en el registro postgresql, dedico mucho tiempo a profundizar en este tema, y ​​finalmente descubro que utilizamos incorrectamente la gema upsert causando un error PG, solo en el log postgresql tenemos la información real de lo que está sucediendo

https://github.com/seamusabshere/upsert/issues/39


Tengo ese problema. Y descubrí que era mi consulta. Significa cuando consulto con asociación sin especificar una columna de tabla. ex:

class Holiday < ApplicationRecord belongs_to :company end class Company < ApplicationRecord has_many :timeoffs end

En la consulta del modelo Holiday I

company.timeoffs.where("(start_date <= ? and end_date >= ?) and id != ?", begin_date, begin_date, 1)

El error ocurre porque no especifiqué la id la tabla. Me funcionó después de que cambié el código a

company.timeoffs.where("(start_date <= ? and end_date >= ?) and time_offs.id != ?", begin_date, begin_date, 1)


Tuve este problema Simplemente reinicie el Servidor Rails y debería funcionar


Tuve un problema similar después de actualizar Rails de 4.2.2 a 4.2.5 tuve que actualizar la gema de pg y el problema comenzó a suceder

9) WorkPolicy#is_publicly_viewable? is publicly visible hides work if deleted Failure/Error: before { DatabaseCleaner.clean_with :deletion } ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block : SELECT tablename FROM pg_tables WHERE schemaname = ANY (current_schemas(false))

La respuesta de Teddy Widom es correcta en este sentido, solo para resumir el problema:

Algunas veces, cuando usas DatabaseCleaner.clean_with :deletion puedes estar interfiriendo con la transacción de PostgreSQL.

Así que la solución para mí fue reemplazar DatabaseCleaner.clean_with :deletion en partes de las pruebas donde esto fue causado con DatabaseCleaner.clean_with :truncation

Solo una cosa más para googlear personas. Si observa este rastro de pila:

An error occurred in an `after(:context)` hook. ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "table_rows" does not exist LINE 1: ...ion_schema.tables WHERE table_schema = ''test'' AND table_rows... ^

... puede ser causado por este problema