Получить данные из pandas на SQL-сервер с PYODBC

Я пытаюсь понять, как python может вытащить данные с FTP-сервера в pandas, а затем переместить его на SQL-сервер. Мой код здесь очень рудиментарный, чтобы сказать наименее, и я ищу любые советы или помощь вообще. Я попытался сначала загрузить данные с FTP-сервера, который отлично работает.... Если я удалю этот код и изменим его на select из ms sql-сервера, это нормально, поэтому строка подключения работает, но вставка в SQL сервер, кажется, вызывает проблемы.

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!"

Когда я удаляю ftp-код, это работает отлично, но я не понимаю, как сделать следующий переход, чтобы получить это на сервере Microsoft SQL, или даже если это возможно без сохранения в файл в первую очередь.

Ответ 1

Для части "write to sql server" вы можете использовать удобный to_sql метод pandas (поэтому нет необходимости перебирать строки и вставлять вручную). См. Документы по взаимодействию с базами данных SQL с помощью pandas: http://pandas.pydata.org/pandas-docs/stable/io.html#io-sql

Вам понадобится как минимум pandas 0,14 для работы, и вам также потребуется sqlalchemy. Например, если df - это DataFrame, полученный из 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)

См. также страницу документации to_sql.
Подробнее о том, как создать механизм соединения с sqlalchemy для sql-сервера с pyobdc, можно найти здесь: http://docs.sqlalchemy.org/en/rel_1_1/dialects/mssql.html#dialect-mssql-pyodbc-connect


Но если ваша цель - просто получить данные csv в базе данных SQL, вы также можете рассмотреть возможность сделать это непосредственно из SQL. См. Например Импорт CSV файла в SQL Server

Ответ 2

Я обнаружил, что использование bcp-утилиты (https://docs.microsoft.com/en-us/sql/tools/bcp-utility) лучше всего работает, когда у вас большой набор данных. У меня 2,7 миллиона строк, которые вставляются со скоростью 80K строк/сек. Вы можете хранить свой фрейм данных как файл csv (используйте вкладки для разделителя, если ваши данные не имеют вкладок и кодировки utf8). С bcp я использовал формат "-c", и он работает без проблем до сих пор.

Ответ 4

Версия Python3 с использованием экземпляра LocalDB SQL:

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()