2012-02-01 10 views
6

Tengo dificultades para escribir lo que debería ser una simple declaración de actualización SQL en SQLAlchemy Core. Sin embargo, no puedo encontrar documentación, ejemplos o tutoriales que muestren cómo combinar múltiples condiciones. Estoy seguro de que está ahí, simplemente no puedo encontrarlo.SQLAlchemy: Expresión de SQL con múltiples condiciones

Aquí está la tabla:

self.struct = Table('struct', 
        metadata, 
        Column('schema_name',   String(40), nullable=False, 
                   primary_key=True), 
        Column('struct_name',   String(40), nullable=False, 
                   primary_key=True), 
        Column('field_type',   String(10), nullable=True), 
        Column('field_len',   Integer,  nullable=True)) 

Aquí está la declaración de inserción & actualización:

def struct_put(self, **kv): 
    try: 
     i = self.struct.insert() 
     result = i.execute(**kv) 
    except exc.IntegrityError: # row already exists - update it: 
     u = self.struct.update().\ 
      where((self.struct.c.struct_name==kv['struct_name'] 
        and self.struct.c.schema_name==kv['schema_name'])).\ 
      values(field_len=kv['field_len'], 
        field_type=kv['field_type']) 
     result = u.execute() 

El código controla la multa de inserción, pero las actualizaciones de todas las filas de la tabla. ¿Me puede ayudar a comprender la sintaxis de esta cláusula where? Todas las sugerencias son bienvenidas, gracias de antemano.

EDIT: La cláusula corregido es el siguiente:

 where((and_(self.struct.c.parent_struct_name==kv['parent_struct_name'], 
        self.struct.c.struct_name==kv['struct_name'], 
        self.struct.c.schema_name==kv['schema_name']))).\ 

Es una sintaxis muy sencilla, pero teniendo en cuenta las muchas capas de SQLAlchemy fue sorprendentemente difícil determinar exactamente lo que se aplica en este contexto.

+4

Un atajo para usar and_() es encadenar varias cláusulas where() Así: .where (a == 1) .where (b == 2) .where (c == 3). Ver [ documentos] (http: //docs.sq lalchemy.org/en/rel_1_0/core/tutorial.html#conjunctions). – Arie

Respuesta

8

Se me parece que está usando la operación "y" de Python, que evaluará una sola de las cláusulas que lo rodean. En su lugar, debe intentar usar la función "y_" de SQLAlchemy. Ponga esas dos cláusulas dentro de la función "and_"

+0

Ah, pensé que la respuesta tenía que ser así de simple. No pude encontrar ningún ejemplo de esto en el tutorial o en otro lugar. Se describieron las funciones, pero no estaba claro para mí que aquí era donde las usaría. Gracias. –

1

En SQLAlchemy, tablename.c es un valor especial que se usa al construir las condiciones que SQLAlchemy tratará en el tiempo de ejecución.

En este caso particular, simplemente está diciendo "actualizar todas las filas donde la columna llamada struct_name coincide con el valor pasado a struct_put(struct_name="struct_value", schema_name="schema_value"), y la columna llamada schema_name coincide con el valor pasado como schema_name.

Cuestiones relacionadas