簡體   English   中英

將 Pandas 數據框插入 SQL 臨時表

[英]Insert pandas data frame into SQL temp table

我正在嘗試在 SQL 數據庫中創建一個臨時表並從 Pandas 數據框中填充該表。 使用 df.to_sql 填充臨時表時收到錯誤。 感謝您的幫助。

import pandas as pd
from sqlalchemy import create_engine
import pandas.io.sql as psql
import urllib

params = urllib.quote_plus("DRIVER={SQL Server};SERVER=ServerAddressHere;DATABASE=DatabaseNameHere;Trusted_Connection=yes")

engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
connection = engine.connect()
resoverall = connection.execute('''SELECT DISTINCT
a.CountryRegionID AS ISO_Short,
b.Name
FROM
CustTable AS a
LEFT JOIN AddressCountryRegion AS b
ON b.CountryRegionID = a.CountryRegionID''')


Countries= pd.DataFrame(resoverall.fetchall())
Countries.columns = resoverall.keys()

Countries= pd.Countries['ISO_Short'].str.upper()

Countries= pd.DataFrame(data=Countries)

temp = connection.execute('''
create table #tempTable
(
ISO_Short varchar(5)
)
''')

Countries.to_sql('Countries',engine)

我收到的錯誤是:

ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]CREATE TABLE 權限在數據庫 'databasename' 中被拒絕。(262) (SQLExecDirectW)") [SQL: u'\\nCREATE TABLE [Countries] (\\n\\t[index] BIGINT NULL,\\n\\t[ISO_Short] VARCHAR(max) NULL\\n)\\n\\n'

更新:

我想到的另一個選擇是使用 Pyodbc 並將國家轉換為字典,然后將字典值傳遞到臨時表中。 使用這種方法,一切正常,直到我嘗試將字典傳遞給臨時表。 我有使用這種方法的以下代碼:

import pandas as pd
import pyodbc
import pandas.io.sql as psql

cnxn = pyodbc.connect('''DRIVER={SQL Server};SERVER=telsmith;
DATABASE=DatabaseNameHere;Trusted_Connection=yes;''')
cursor = cnxn.cursor()

Countries= '''
SELECT DISTINCT
a.CountryRegionID AS ISO_Short,
b.Name
FROM
CustTable AS a
LEFT JOIN AddressCountryRegion AS b
ON b.CountryRegionID = a.CountryRegionID
'''

Countries= psql.read_sql(Countries, cnxn)


Countries= Countries['ISO_Short'].str.upper()

Countries= pd.DataFrame(data=Countries)

Countriesdict = Countries.to_dict()


Temp = '''
create table #tempTable
(
    ISO_Short varchar(5)
)

'''

cnxn.commit()

# This is where I run into difficulty
placeholders = ', '.join(['%s'] * len(Countriesdict ))
columns = ', '.join(Countriesdict .keys())
sql = "INSERT INTO #tempTable VALUES ( %s )" % (placeholders)
cursor.execute(sql, Countriesdict.values())

這可能聽起來有點愚蠢,但看看錯誤:

ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]CREATE TABLE 權限在數據庫 'databasename' 中被拒絕。(262) (SQLExecDirectW)") [SQL: u'\\nCREATE TABLE [Countries] (\\n\\t[index] BIGINT NULL,\\n\\t[ISO_Short] VARCHAR(max) NULL\\n)\\n\\n'

你有任何名為databasename嗎? 由於找不到數據庫,因此無法創建表。 我運行了相同的代碼,它工作得很好。 我相信這就是原因

不是嚴格意義上的 SQLAlchemy 問題。 您需要從 DBA 獲取服務器上的“CREATE TABLE”權限以獲取某些用戶名和密碼,並使用這些憑據訪問您的數據庫。 嘗試包括“UID=uname;PWD=pword;” 在您的參數中獲取一些許可憑據。

我可能有一個對我有用的解決方案:

from sqlalchemy import create_engine
import urllib
params = urllib.parse.quote_plus("DRIVER={SQL Server};SERVER=10.233.6.52;DATABASE=databaseName;UID=xxx;PWD=Welcome1!")

engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
connection = engine.connect()
df.to_sql('tempTable',engine)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM