2016-05-23 2 views
0

Предположим, у меня есть список столбцов в питона равной длины (в примере, приведенном ниже, каждый столбец имеет 4 элемента, но в моей реальной работе каждый столбец имеет около 500+ элементов):преобразования столбцов в базе данных PostgreSQL

col0 = [1, 12, 23, 41] # also used as a primary key 
col1 = ['asdas','asd', '1323', 'adge'] 
col2 = [true, false, true, true] 
col4 = [312.12, 423.1, 243.56, 634.5] 

и у меня есть таблица PostGreSQL уже определена, со столбцами: Col0 (целое число, а также первичный ключ), cOL1 (характер изменения), Col2 (булево), Col3 (числовое)

Я написал следующий код для подключения к базе данных postgresql (которая, казалось, работала нормально):

import psycopg2 
... 
conn = psycopg2.connect("dbname='mydb' user='myuser' host='localhost' password = 'mypwd') 
cur = conn.cursor() 

Теперь предположим, что я хочу, чтобы раздвинуть столбцы PostGreSQL таблицы myt, где я хочу, чтобы строки в населенной как:

Col1 Col2  Col3 Col4 
1  'asdas' true 312.12 
12 'asd' false 423.1 
... 

Я видел примеры на SO such as this one где пример для чтения из файла CSV:

for row in reader: 
    cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)", (variable1, variable2)) 

(a) Могу ли я принять что-то подобное для моего случая? Будет ли это работать:

for i in range(0, len(col0)): 
    cur.execute("INSERT INTO myt (Col1, Col2, Col3, Col4) VALUES (%??, %s, %??, %f)", (col0[i], col1[i], col2[i], col3[i])) 

(б) Если да, то есть спецификатор типа для питона целого числа, булева, поплавок типа, когда соответствующие типов PostgreSQL являются целыми числами, логические и числовые?

(c) Кроме того, что, если у меня есть 40 таблиц, а не 4 таблицы. Должен ли я написать длинную строку:

"INSERT INTO myt (Col1, Col2, ..., Col40) VALUES (%d, %s, ..., %f)", (col0[i], ...)) 
+0

вы спрашиваете Severa Там есть разные вопросы. – Jasen

ответ

0

а, Ь:. да, это будет работать, psycopg2 использует %s для представления всех типов, что это именно так, как она работает (так что не используйте %?? и т.д ...)

с:

"insert into {t} ({c}) values ({v})".format(
    t=tablename, 
    c=','.join(columns_list), 
    v=','.join(['%'] * len(columns_list)) 

вас ближе к универсальному выражению вставки, но вам все еще нужно, чтобы петля ...