web-dev-qa-db-fra.com

Obtenez des données de pandas sur un serveur SQL avec PYODBC

J'essaie de comprendre comment Python pourrait extraire des données d'un serveur FTP vers des pandas puis les transférer sur un serveur SQL. Mon code ici est très rudimentaire, c'est le moins qu'on puisse dire, et je suis à la recherche de conseils ou d'aide. J'ai d'abord essayé de charger les données à partir du serveur FTP, ce qui fonctionne bien .... Si je supprime ensuite ce code et le modifie en un serveur select de ms SQL, il est correct si la chaîne de connexion fonctionne, le serveur semble causer des problèmes.

import pyodbc
import pandas
from ftplib import FTP
from StringIO import StringIO
import csv

ftp = FTP ('ftp.xyz.com','user','pass' )
ftp.set_pasv(True)
r = StringIO()
ftp.retrbinary('filname.csv', r.write)

pandas.read_table (r.getvalue(), delimiter=',')


connStr = ('DRIVER={SQL Server Native Client 10.0};SERVER=localhost;DATABASE=TESTFEED;UID=sa;PWD=pass')
conn = pyodbc.connect(connStr)

cursor = conn.cursor()
cursor.execute("INSERT INTO dbo.tblImport(Startdt, Enddt, x,y,z,)" "VALUES                  (x,x,x,x,x,x,x,x,x,x.x,x)")
cursor.close()
conn.commit()
conn.close()
print"Script has successfully run!"

Lorsque je supprime le code ftp, cela fonctionne parfaitement, mais je ne comprends pas comment effectuer le saut suivant pour le placer dans Microsoft SQL Server, ni même si cela est possible sans enregistrer préalablement dans un fichier.

13
andy redmayne

Pour la partie 'écriture sur serveur SQL', vous pouvez utiliser la méthode pratique de pandas to_sql (vous n'avez donc pas besoin de parcourir les lignes et de faire l'insertion manuellement). Voir la documentation sur l'interaction avec les bases de données SQL avec les pandas: http://pandas.pydata.org/pandas-docs/stable/io.html#io-sql

Pour que cela fonctionne, vous aurez besoin d'au moins 0,14 pandas et vous devrez également installer sqlalchemy. Un exemple, en supposant que df est le DataFrame que vous avez obtenu de read_table:

import sqlalchemy
import pyodbc
engine = sqlalchemy.create_engine("mssql+pyodbc://<username>:<password>@<dsnname>")

# write the DataFrame to a table in the sql database
df.to_sql("table_name", engine)

Voir aussi la page documentation de to_sql .
Plus d’informations sur la création du moteur de connexion avec sqlalchemy pour serveur SQL avec pyobdc, vous pouvez trouver ici: http://docs.sqlalchemy.org/en/rel_1_1/dialects/mssql.html#dialect-mssql -pyodbc-connect


Mais si votre objectif est simplement d’obtenir les données csv dans la base de données SQL, vous pouvez également envisager de le faire directement à partir de SQL. Voir par exemple Importer un fichier CSV dans SQL Server

29
joris

J'ai constaté que l'utilisation de l'utilitaire bcp ( https://docs.Microsoft.com/en-us/sql/tools/bcp-utility ) fonctionnait mieux lorsque vous disposiez d'un grand ensemble de données. J'ai 2,7 millions de lignes qui insère à 80K lignes/sec. Vous pouvez stocker votre cadre de données sous forme de fichier csv (utilisez des tabulations comme séparateur si vos données ne possèdent pas de tabulation ni d’encodage utf8). Avec bcp, j'ai utilisé le format "-c" et cela fonctionne sans problème jusqu'à présent.

2
Babu Arunachalam

Version Python3 utilisant une instance SQL LocalDB:

from sqlalchemy import create_engine
import urllib
import pyodbc
import pandas as pd

df = pd.read_csv("./data.csv")

quoted = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};SERVER=(localDb)\ProjectsV14;DATABASE=database")
engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted))

df.to_sql('TargetTable', schema='dbo', con = engine)

result = engine.execute('SELECT COUNT(*) FROM [dbo].[TargetTable]')
result.fetchall()
0
Random