2011-09-19 10 views
9

Mi postgres consulta es:Cómo se insertan o se selecciona la fila id en postgres usando pitón

query = """INSERT INTO statustable(value) SELECT '%s' 
       WHERE NOT EXISTS (SELECT id, value FROM statustable 
       WHERE value = '%s') RETURNING id""" % (status, status) 
    cursor_postgres.execute(query) 
    conn_postgres.commit() 
    statusId = cursor_postgres.fetchone()[0] 
    print "statusId" + str(statusId) 

que necesita para obtener el valor de estado recién insertada Identificación si no lo existe, o seleccionar su identificación si ya existen. RETURNING id bloqueó esta consulta por completo, así que tuve que eliminarla para que la inserción selectiva funcione al menos.

¿Alguna pista sobre cómo obtener el ID de estado aquí? En otra instancia, estoy haciendo un Upsert. (Insertar si no existe, actualizar de lo contrario) Aquí de nuevo, necesito la identificación de fila insertada o actualizada. (No, no estoy utilizando procedimientos almacenados, si ese era su primera pregunta ...)

Gracias de antemano

+0

Me parece que la manera más rápida de hacer esto es hacer tres consultas (dentro de una transacción, si es necesario). 1) "ID SELECCIONAR DESDE ajustable DONDE valor = '% s'"% (estado) 2) Si no se devolvieron las filas, "INSERTAR EN ESTABLECIBLE (valor), '% s'"% (estado). 3) "SELECT curval (pk_seq)" cualquiera que sea pk_seq se llama como la secuencia para su identificación de clave principal. Pero como esto no es lo que pediste, no está en una respuesta. –

+0

gracias por la respuesta @ed. De hecho, 2 y 3 se pueden combinar mediante 'INSERT INTO variable (valor),'% s ​​'RETURNING id "% (estado)' ya que esto también devolverá la identificación. Pero estaba buscando poner todo esto en uno. – jerrymouse

Respuesta

10

No puedo decir que entiendo completamente su motivación para insistir en una sola consulta. Creo que su mejor opción es tener dos consultas simples:

  1. SELECT id FROM statustable WHERE value = '%s'. Esto le proporciona la identificación si la entrada existe, en cuyo caso omita el paso 2;
  2. INSERT INTO statustable(value) VALUES('%s') RETURNING id. Esto le dará el id de la entrada recién creada.

Por último, aunque no he verificado si esto es un problema, fetchone() parece sospechoso.

+0

Gracias por la repetición @aix, hice exactamente eso, bifurqué mi consulta en 2. Mi motivación para la consulta única fue solo para probar si se puede hacer porque parecía factible. fetchone() se usa en una confirmación porque el ID de devolución NO Devolver Id. a menos que se haya confirmado (Obtenía un tipo Ninguno) – jerrymouse

Cuestiones relacionadas