SQLAlchemy: выражение SQL с несколькими условиями где - PullRequest
10 голосов
/ 01 февраля 2012

У меня проблемы с написанием того, что должно быть простым оператором обновления SQL в SQLAlchemy Core. Тем не менее, я не могу найти какую-либо документацию, примеры или учебники, которые показывают, как объединить несколько условий. Я уверен, что это там - просто не могу найти это.

Вот таблица:

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) )

Вот оператор вставки и обновления:

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()

Код прекрасно обрабатывает вставку, но обновляет все строки в таблице. Можете ли вы помочь мне понять синтаксис этого предложения where? Все предложения приветствуются - заранее спасибо.

РЕДАКТИРОВАТЬ: исправленное предложение выглядит следующим образом:

        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']))).\

Это очень простой синтаксис, но, учитывая множество уровней SQLAlchemy, было удивительно трудно определить, что именно применяется в этом контексте.

Ответы [ 2 ]

13 голосов
/ 01 февраля 2012

Мне кажется, что вы используете операцию "и" Python, которая оценивает только одно из предложений, окружающих его.Вместо этого вы должны попробовать использовать функцию «and_» из SQLAlchemy.Поместите эти два предложения в функцию "and_".

1 голос
/ 01 февраля 2012

В SQLAlchemy tablename.c - это специальное значение, которое вы используете при построении условий, которые будут обрабатываться SQLAlchemy во время выполнения.

В данном конкретном случае вы просто говорите «обновить все строки, гдестолбец с именем struct_name соответствует значению, переданному в struct_put(struct_name="struct_value", schema_name="schema_value"), а столбец с именем schema_name соответствует значению, переданному как schema_name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...