2016-02-25 4 views
0

Мне нужно создать форму поиска на основе ввода формы запроса с использованием фляжной рамки. Запрос должен быть динамически построен на основе различных входных значений параметров, используя sqlalchemy CORE ONLY. Некоторые из значений могут быть пустыми. Также нужна команда curl для того же самого. Я столкнулся с методом sqlalchemy orm, использующим фильтр. Как именно я должен подойти? Я попробовал следующее: стол:sqlalchemy core построить динамический запрос

docs = Table("docs", metadata, 
         Column("id", Integer, primary_key=True), 
         Column("file_name", String), 
         Column("custom_tag", String, nullable=True), 
         Column("description", String, nullable=True), 
         Column("up_date", DateTime(timezone=True), 
          default=datetime.datetime.utcnow), 
         Column("category_id", Integer, 
          ForeignKey("categories.id"), nullable=True), 
         Column("sub_category_id", Integer, 
          ForeignKey("sub_categories.id"), nullable=True), 
         Column("alert_date", DateTime(timezone=True))) 

локон:

curl -b cookies.txt -X POST http://localhost:5000/api/v1.0/docs -d "category_id=1&sub_category_id=None&alert_date=None" 

Здесь любое из значений параметра являются необязательными.

Вид:

@app.route('/api/v1.0/docs', methods=['POST']) 
def search_docs(): 
     if request.method == 'POST': 
      doc_list = [] 
      category_id = request.form['category_id'] 
      sub_category_id = request.form['sub_category_id'] 
      custom_tag = request.form['custom_tag'] 
      alert_date = request.form['alert_date'] 

      f_dict = { 
       'category_id': category_id, 
       'sub_category_id': sub_category_id, 
       'alert_date': alert_date 
       } 
      for f in f_dict: 
       if f_dict[f] == "None": 
        f_dict[f] = None 

      s = select([docs]).\ 
       where(
       and_(
        docs.c.category_id == category_id, 
        docs.c.sub_category_id == sub_category_id, 
        docs.c.alert_date == alert_date 
        ) 
       ) 
      print str(s) 
      rs = conn.execute(s) 
      for r in rs: 
       doc_list.append(dict(r)) 

      return jsonify({'doc_list': doc_list}), 200 

Я удалил некоторые из атрибутов, как я просто попробовать. Пожалуйста, верните, как можно сгенерировать запрос. У меня есть много значений атрибутов, которые нужно учитывать в запросе. Использование колбы 0.10, ядро ​​sqlalchemy, python 2.7

При выполнении вышеуказанных данных данные не сохраняются последовательно в таблице. Иногда он сохраняет запись, но во много раз он подбрасывает код статуса http 400. Как сравнить sub_category_id с Null значением, которое является необязательным?

+0

Можете ли вы рассказать о том, что вы подразумеваете под «тем, как запрос может быть сгенерирован», из вашего примера вы уже создаете запрос SELECT и выполняете его. Вы имеете в виду просмотр исходного SQL? –

+0

@WarrenSpencer Я отредактировал комментарии к вышеуказанному запросу. Я просто хочу, чтобы sql выполнялся каждый раз без кода http-статуса 400 – user956424

+0

@WarrenSpencer, выпрямленный статус 400, добавив точно такое же количество параметров в команду curl, что и в передаваемом dict. – user956424

ответ

1

Похоже, вы хотите условно построить предложение where, основанное на том, соответствует ли значение для любого фильтра None. Есть ли что-то нравится эта работа для вас ?:

conditions = [] 
if category_id is not None: 
    conditions.append(docs.c.category_id == category_id) 
if sub_category_id is not None: 
    conditions.append(docs.c.sub_category_id == sub_category_id) 
if alert_date is not None: 
    conditions.append(docs.c.alert_date == alert_date) 

s = select([docs]).where(and_(*conditions)) 

Чтобы убедиться в None значения для фильтров, которые вы хотите исключить, вы можете исключить их из curl командной строки:

-d "category_id=1&sub_category_id=None&alert_date=None" 

становится:

-d "category_id=1" 

Затем в сценарии Python, вы можете использовать get которого по умолчанию возвращаемое значение None:

category_id = request.form.get('category_id') 
sub_category_id = request.form.get('sub_category_id') 
... 

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

+0

Проблема заключается в том, когда передается запрос POST, значения «None» сохраняются как unicode, поэтому значения атрибутов нужно сравнивать как: if request.form ['category_id'] == 'None': then request.form ['category_id'] = None в представлении. Есть ли лучший способ? – user956424

+1

Не могли бы вы просто не передать исключенные элементы при использовании curl, а затем использовать 'request.form.get (" category_id ")', который вернет реальный None? – quornian

+0

Как точно в скручивании? – user956424

Смежные вопросы