Psycopg2: запрос с использованием внешней переменной в приложении Dash - PullRequest
0 голосов
/ 04 июля 2018
@app.callback(
    Output('react-graph','figure'),
    [Input('reg_col','value')]
)

def update_graph(reg_col_name):

    print(reg_col_name)
    cur.execute("SELECT fruits FROM react_table WHERE region = 'reg_col_name'")
    fruits1=cur.fetchall()
    fruits_val = [fruit[0] for fruit in fruits1]
    cur.execute("SELECT sales FROM react_table WHERE region = 'reg_col_name'")
    sales1=cur.fetchall()
    sales_val = [sales[0] for sales in sales1]
    print(sales_val)
    clo = conn.rollback()


    return {
        'data': [go.Bar(
            x=fruits_val, y=sales_val, name='SF'
        )]
    }

У меня есть следующий обратный вызов для моего приложения. Входные данные - это имя региона, переданное через reg_col_name. При печати reg_col_name я выбираю опцию ввода, и она работает.

Проблема возникает, когда я пытаюсь использовать эту же переменную для запроса в базе данных postgres. при печати sales_val я должен получить список номеров продаж, но выход просто []

Таблица выглядит примерно так.

Region  Fruits   Sales
reg1    apple     67
reg1    banana    100
reg1    mango     38
reg1    pineapple 78
reg1    peach     60
reg1    watermelon63
reg2    apple     10
reg2    banana    64
reg2    mango     42
reg2    pineapple 16
reg2    peach     68
reg2    watermelon21
reg3    apple     7
reg3    banana    59
reg3    mango     72
reg3    pineapple 4
reg3    peach     96
reg3    watermelon63
reg4    apple     83
reg4    banana    32
reg4    mango     17
reg4    pineapple 20
reg4    peach     83
reg4    watermelon71

Может ли это быть связано с неправильным использованием функции rollback ()?

1 Ответ

0 голосов
/ 05 июля 2018

Код передает reg_col_name в виде литеральной строки в запрос. Чтобы передать значение переменной в качестве параметра , вы должны сделать:

cur.execute("SELECT fruits FROM react_table WHERE region = (%s)", (reg_col_name,))

Если вы хотите избежать выполнения двух запросов, ваша функция может запуститься так:

def update_graph(reg_col_name):
    cur.execute("SELECT fruits, sales FROM react_table WHERE region = (%s)", (reg_col_name,))
    result = cur.fetchall()
    fruits_val, sales_val = zip(*result)

Если вам нужно, чтобы fruits_val и sales_val были списками, вы все равно можете преобразовать их потом:

fruits_val = list(fruits_val)
sales_val = list(sales_val)
...