2016-04-26 3 views
0

У меня есть список кортежей, которые я хочу загрузить в мою базу данных. Я хочу сделать это с одним запросом, так что мне не нужно открывать соединение, пока я разбираю каждый кортеж.Импорт списка кортежей в Postgres через Python

Пример моего списка кортежей следующий (этот список будет значительно длиннее): tuple_list = [(u'17 ', u'1', u'2 ', u'2'), (u '17', u'2 ', u'1', u'4 ')]

Я хочу написать один запрос в postgres, который будет принимать этот tuple_list и работать через список, чтобы заполнить таблицу под названием «Прогнозы», в одном вызове к дБ.

Одиночный вызов выглядит следующим образом:

insert into 'Predictions' (userid, fixture_no, home_score, away_score) values (17, 1, 2, 2) 

Я смотрел в преобразовании моего кортежа в файл XML, но интересно, если есть лучший способ сделать это только в Postgres, используя список кортежей?

Если нет, файл XML, мне удалось произвести внешний вид, как это ...

<root> 
    <User_Id/> 
    <Fix_No/> 
    <Home_Score/> 
    <Away_Score/> 
    <User_Id>17</User_Id> 
    <Fix_No>1</Fix_No> 
    <Home_Score>2</Home_Score> 
    <Away_Score>2</Away_Score> 
    <User_Id>17</User_Id> 
    <Fix_No>2</Fix_No> 
    <Home_Score>1</Home_Score> 
    <Away_Score>4</Away_Score> 
</root> 

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

Любые мысли или советы были бы замечательными!

ответ

1

Вы можете использовать синтаксис множественных значений VALUES, описанный в примерной части postgresql documentation. Здесь ist python snipped, который создает оператор insert из tuple_list из вашего вопроса.

tuple_list = [(u'17',u'1', u'2', u'2'), (u'17',u'2', u'1', u'4')] 
a = ["("+", ".join(a)+")" for a in tuple_list] 
sql = "insert into 'Predictions' (userid, fixture_no, home_score, away_score) VALUES %s" % (",".join(a)) 
print(sql) 

# Insert into database (code from memory) 
args_str = ','.join(cursor.mogrify("%s", (x,)) for x in tuple_list) 
cursor.execute("INSERT INTO 'Predictions' (userid, fixture_no, home_score, away_score) VALUES "+args_str) 

Выход:

insert into 'Predictions' (userid, fixture_no, home_score, away_score) VALUES (17, 1, 2, 2),(17, 2, 1, 4) 
+0

Я новичок в Postgres, так что комментарий очень полезно. Поскольку у моего списка кортежей может быть 5 кортежей или даже 50 кортежей, как я могу написать запрос, который адаптируется к числу кортежей, которые я передаю ему? – LemusThelroy

+0

Это фантастический ответ. Спасибо. Если этот запрос находится в моем коде Python, считаете ли вы, что это будет безопасно от SQL-инъекции? Поскольку tuple_list поступает из пользовательского ввода из веб-приложения. – LemusThelroy

+0

@LemusThelroy Вы должны убедиться, что все вставленные данные были правильно экранированы. Лучший способ - создать хранимые процедуры. Этот пример НЕ сохраняется! – salomonderossi

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