У меня есть несколько ежемесячных данных о погоде, которые я хочу вставить в таблицу базы данных Oracle, но я хочу вставить соответствующие записи в пакет, чтобы быть более эффективным. Может ли кто-нибудь посоветовать, как я это сделаю на Python?
Например, предположим, что в моей таблице четыре поля: идентификатор станции, дата и два поля значений. Записи однозначно идентифицируются по полям идентификатора станции и даты (составной ключ). Значения, которые мне нужно будет вставить для каждой станции, будут храниться в списке с X числами данных за полные годы, поэтому, например, если есть значения за два года, тогда списки значений будут содержать 24 значения.
Я предполагаю, что ниже я бы сделал это, если бы я хотел вставлять записи по одной за раз:
connection_string = "scott/tiger@testdb"
connection = cx_Oracle.Connection(connection_string)
cursor = cx_Oracle.Cursor(connection)
station_id = 'STATION_1'
start_year = 2000
temps = [ 1, 3, 5, 7, 9, 1, 3, 5, 7, 9, 1, 3 ]
precips = [ 2, 4, 6, 8, 2, 4, 6, 8, 2, 4, 6, 8 ]
number_of_years = len(temps) / 12
for i in range(number_of_years):
for j in range(12):
# make a date for the first day of the month
date_value = datetime.date(start_year + i, j + 1, 1)
index = (i * 12) + j
sql_insert = 'insert into my_table (id, date_column, temp, precip) values (%s, %s, %s, %s)', (station_id, date_value, temps[index], precips[index]))
cursor.execute(sql_insert)
connection.commit()
Есть ли способ сделать то, что я делаю выше, но так, чтобы выполнить пакетную вставку для повышения эффективности? Кстати, мой опыт связан с Java / JDBC / Hibernate, поэтому, если кто-то может дать объяснение / пример, который сравнивается с подходом Java, это было бы особенно полезно.
РЕДАКТИРОВАТЬ: Возможно, мне нужно использовать cursor.executemany (), как описано здесь?
Заранее благодарим за любые предложения, комментарии и т. Д.
.executemany()
? - person Martijn Pieters   schedule 16.02.2013.executemany()
не пакетное обновление; вы будете выполнять столько операторов DML, сколько у вас есть курсор, который вы выполняете ... Это делает ваш код Python более чистым, но не более снисходительным к базе данных. Как выглядят ваши исходные данные; вводится ли он пользователем и таким образом сохраняется в переменных в вашем коде или в текстовом файле и т. д.? - person Ben   schedule 16.02.2013.executemany()
делает только один вызовOCIStmtExecute()
- person alldayremix   schedule 24.02.2013OCIstmtExecute
не выполняет пакетную обработку : Для операторов, отличных от SELECT, количество раз, которое этот оператор выполняется, равно iters - rowoff. В источнике cCursor_ExecuteMany
передает количество строк вCursor_InternalExecute
, который затем передает то же самое вOCIStmtExecute
. - person Ben   schedule 24.02.2013.executemany()
просто исключает время приема-передачи, которое потребовалось бы для повторных вызовов.execute()
, а сообщение в блоге сформулировано неуклюже. Итак, единственный способ выполнить пакетную операцию - вызвать.execute()
с помощью оператора типаBULK INSERT...
илиINSERT ALL...
. - person alldayremix   schedule 25.02.2013