Как исправить проблему с привязкой данных с помощью SqlAlchemy - PullRequest
0 голосов
/ 24 сентября 2019

Я использую Python 3.6 с Flask.Я пытаюсь подключиться к базе данных Amazon Redshift с помощью SqlAlchemy.Запрос имеет операцию IN в предложении Where, и значения для него отправляются путем привязки его к запросу.Почему-то это не работает?Он не выдает ошибку, но не приносит никаких результатов.Если я жестко закодирую значения в запросе, он работает нормально.

Я испробовал несколько предложенных вариантов, но безуспешно - 1. связывание значений в виде списка или строки, разделенной запятыми 2. удаление скобок в запросе 3. изменение кода на stmt = text (file.read ()) stmt = stmt.bindparams (search = ids) df = pd.read_sql_query (stmt, connection)

    dtv_script.txt
    Select * from tbl1 where id IN (:search)


    def get_dt(id_list):

        engine = create_engine('postgresql://xxxxxxxxxx')

        connection = engine.connect()

        ids = list(id_list.split(","))

        #dtv_script.txt has the sql
        file = open('dtv_script.txt')
        sql = text(file.read())

        df = pd.read_sql_query(sql, connection, params={'search' : ids})

        connection.close()
        return df

Идентификаторы публикуются из формы в index.html.Образцы идентификаторов = 2011592,2021593,2033591.Страница маршрута фляги захватывает ее в функции get_dt () и возвращает фрейм данных обратно на страницу results.html для отображения

@app.route('/result', methods=['POST']) 
def result(): 
    if request.method == 'POST': 
        id_list = request.form.get('ids') 
        df_dt = dofri.get_dt(id_list) 
        return render_template('result.html', **locals()) 
    else: 
        flash('There was some error. Check the logs') 
        return index() 

1 Ответ

1 голос
/ 27 сентября 2019

Ниже приведено решение.Обязательно

  1. добавить - из sqlalchemy import bindparam
  2. удалить - скобки из запроса
  3. добавить - расширить = True
dtv_script.txt
        Select * from tbl1 where id IN :search

def get_dt(id_list):

    engine = create_engine('postgresql://xxxxxxxxxx')
    connection = engine.connect()

    ids = list(id_list.split(","))

    #dtv_script.txt has the sql
    file = open('dtv_script.txt')


    sql = file.read()


    t = text(sql)
    t = t.bindparams(bindparam('search', expanding=True))
    df = pd.read_sql_query(t, connection, params={'search' : ids })
    connection.close()
    return df
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...