Comment puis-je insérer un lot dans une base de données Oracle à l'aide de Python?
J'ai quelques mensuelle des données météorologiques que je veux insérer dans une table de base de données Oracle, mais je veux insérer des enregistrements correspondants dans un lot, afin d'être plus efficace. Quelqu'un peut-il nous conseiller quant à la façon dont j'allais le faire en Python?
Par exemple, disons que mon tableau comporte quatre champs: ID de la station, une date, et deux champs de valeur. Les enregistrements sont identifiés de façon unique par l'ID de la station et des champs de date (clé composite). Les valeurs que je vais avoir à insérer pour chaque station sera conservé dans une liste avec un nombre X d'années complètes de données, si par exemple il y a deux ans, de valeurs, la valeur des listes contiennent des 24 valeurs.
Je suppose que ci-dessous est la façon dont je le ferais si je voulais insérer les enregistrements un à un:
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()
Est-il un moyen de faire ce que je fais ci-dessus, mais d'une manière qui effectue une insertion de lot afin d'augmenter l'efficacité? BTW mon expérience avec Java/JDBC/Hibernate donc si quelqu'un peut donner une explication/exemple de ce qui se compare à la Java approche alors qu'il serait particulièrement utile.
EDIT: j'ai peut-être besoin d'utiliser le curseur.executemany() comme décrit ici?
Merci d'avance pour toutes les suggestions, commentaires, etc.
source d'informationauteur James Adams
Vous devez vous connecter pour publier un commentaire.
Voici ce que j'ai trouvé qui semble bien fonctionner (mais s'il vous plaît commentaire si il y a un moyen de l'améliorer):
Utilisation
Cursor.prepare()
etCursor.executemany()
.De la cx_Oracle documentation:
Ainsi, à l'aide de ces deux fonctions, votre code devient:
Également voir Oracle Mastering Oracle+Python série d'articles.
Que l'un des commentaires dit, pensez à utiliser
INSERT ALL
. Soi-disant il va être beaucoup plus rapide que d'utiliserexecutemany()
.Par exemple:
http://www.techonthenet.com/oracle/questions/insert_rows.php
Je voudrais créer une grande instruction SQL insert à l'aide de l'union:
Vous pouvez construire la chaîne de caractères en python et la donner à oracle comme une instruction à exécuter.
pour info le résultat de mon test:
Je l'insérer dans 5000 lignes. 3 colonnes par ligne.
code python, le programme d'installation de sql comme
insérez le tout dans t(a,b,c)
sélectionnez :1, :2, :3 à partir de la double union all select :4, :5: :6 de daul...
Le code python pour l'installation de cette longue sql, ça coûte 0.145329 secondes.
Je test mon code sur un très vieux soleil de la machine. cpu: 1415 MH.
dans le troisième cas, j'ai vérifié la base de données côté, l'attente de l'événement est "SQL*Net a plus de données à partir d'un client". ce qui signifie que le serveur est en attente pour plus de données à partir d'un client.
Le résultat de la troisième méthode est incroyable pour moi sans le tester.
de sorte que le court suggestion de moi, c'est juste pour utiliser executemany.