适用于MS SQL的pandas to_sql

时间:2019-02-11 20:39:03

标签: sql-server pandas sqlalchemy pandas-to-sql

我正在尝试将数据帧保存到使用Windows身份验证的MS SQL。我尝试使用engineengine.connect()engine.raw_connection(),它们都抛出错误: 分别为'Engine' object has no attribute 'cursor''Connection' object has no attribute 'cursor'Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ...

params = urllib.parse.quote('DRIVER={ODBC Driver 13 for SQL Server};'
                           'SERVER=server;'
                           'DATABASE=db;'
                           'TRUSTED_CONNECTION=Yes;')

engine = create_engine('mssql+pyodbc:///?odbc_connect=%s' % params)

df.to_sql(table_name,engine, index=False)

2 个答案:

答案 0 :(得分:1)

这是对我的原始答案的更新。基本上,这是老派的做事方式(INSERT INTO)。我最近偶然发现了一种将数据从 Python 推送到 SQL Server 的超级简单、可扩展和可控的方法。尝试示例代码,如果您有其他问题,请回帖。

import pyodbc
import pandas as pd

engine = "mssql+pyodbc://your_server_name/your_database_name?driver=SQL Server Native Client 11.0?trusted_connection=yes"

... dataframe here...

dataframe.to_sql(x, engine, if_exists='append', index=True)

dataframe 很容易解释。

x = 您希望表在 SQL Server 中的名称。

答案 1 :(得分:0)

这完全可以满足您的要求。

# Insert from dataframe to table in SQL Server
import time
import pandas as pd
import pyodbc

# create timer
start_time = time.time()
from sqlalchemy import create_engine


df = pd.read_csv("C:\\your_path\\CSV1.csv")

conn_str = (
    r'DRIVER={SQL Server Native Client 11.0};'
    r'SERVER=name_of_your_server;'
    r'DATABASE=name_of_your_database;'
    r'Trusted_Connection=yes;'
)
cnxn = pyodbc.connect(conn_str)

cursor = cnxn.cursor()

for index,row in df.iterrows():
    cursor.execute('INSERT INTO dbo.Table_1([Name],[Address],[Age],[Work]) values (?,?,?,?)', 
                    row['Name'], 
                    row['Address'], 
                    row['Age'],
                    row['Work'])
    cnxn.commit()
cursor.close()
cnxn.close()

# see total time to do insert
print("%s seconds ---" % (time.time() - start_time))