web-dev-qa-db-fra.com

Comment écrire pandas dataframe dans la base de données Oracle en utilisant to_sql?

Je suis un nouvel apprenant Oracle. J'essaie d'écrire un pandas dataframe dans une table Oracle. Après avoir fait des recherches en ligne, j'ai trouvé que le code lui-même est très simple, mais je ne sais pas pourquoi mon code ne fonctionne pas) t travailler.

J'ai lu le pandas dataframe de mon fichier local:

import cx_Oracle
import pandas as pd
import os

dir_path = os.path.dirname(os.path.realpath("__file__"))
df = pd.read_csv(dir_path+"/sample.csv")

Maintenant, imprimez df, le cadre de données df doit être comme ceci:

   DATE            YEAR     MONTH      SOURCE      DESTINATION
0  11/1/2017 1:00  2017     1          AL          CO  
1  11/2/2017 1:00  2017     5          GA          ID  
2  11/3/2017 1:00  2017     12         GA          MO    

Ensuite, je crée une connexion avec la base de données en utilisant cx_Oracle, cela fonctionne. Ensuite, j'essaie d'écrire le fichier de données df dans le tableau TEST. Cette table TEST est une table vide qui existe déjà dans la base de données Oracle, elle contient des colonnes incluant DATE, YEAR, MONTH, SOURCE, DESTINATION dans Oracle. Tous les types de données correspondent aux exemples de données df. Mon code est le suivant:

conn_str = u'account/password@Host:1521/server'
conn = cx_Oracle.connect(conn_str)

# Write records stored in a DataFrame to a Oracle database
df.to_sql('TEST', conn, if_exists='replace') # the error shows here

conn.close()

Il montre une erreur:

DatabaseError: Échec de l'exécution sur sql 'SELECT name FROM sqlite_master WHERE type =' table 'AND name = ?;': ORA-01036: nom/numéro de variable non valide

Comment résoudre le problème? Merci beaucoup pour votre temps!

6
Haven Shi

J'ai vu des questions similaires sur SO - cela se produit lorsque vous essayez d'écrire dans Oracle DB à l'aide d'un objet de connexion créé par cx_Oracle.

Essayez de créer une connexion à l'aide de SQL Alchemy:

import cx_Oracle
from sqlalchemy import types, create_engine

conn = create_engine('Oracle+cx_Oracle://scott:tiger@Host:1521/?service_name=hr')

df.to_sql('TEST', conn, if_exists='replace')
9
MaxU