4

我正在尝试将数据框保存到使用 Windows 身份验证的 MS SQL。我试过使用engine, engine.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)
4

2 回答 2

2

这将完全符合您的要求。

# 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))
于 2019-03-08T18:18:19.917 回答
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)

数据框非常不言自明。

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

于 2021-04-14T01:18:52.677 回答