2016-03-29 11 views
2

SQLデータベースに一時テーブルを作成し、そのテーブルをpandasデータフレームから作成しようとしています。 df.to_sqlを使用して一時表にデータを入力すると、エラーが発生します。助けてくれてありがとう。SQL tempテーブルにpandasデータフレームを挿入します

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ドライバー] [SQL Server] CREATE TABLEを\ n \ t [インデックス] BIGINT NULL、\ n \ t [ISO_Short] VARCHAR(最大)NULL(データベース 'databasename'で拒否された権限(262)(SQLExecDirectW) \ n)は、\ nは\ n」は

UPDATE:

私は考え、他のオプションはPyodbcを使用し、辞書に国を変換することです辞書の値を一時テーブルに渡します。このメソッドを使用すると、辞書をtempテーブルに渡して渡すまではすべて動作します。私はこのアプローチを使用して次のコードを持っています:

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

答えて

0

厳密にはSQLAlchemyの懸念事項ではありません。ユーザ名とパスワードについては、DBAからサーバ上で "CREATE TABLE"パーミッションを取得し、DBにアクセスするためにそれらのクレデンシャルを使用する必要があります。 「UID = uname; PWD = pword;」と入力してください。いくつかの許可された資格証明のためのあなたのparamsで。

+0

ありがとうございます。私はSQL Serverで作成クエリをテストし、正常に動作します。 – Andrew

+0

確かに、あなたのログインパラメータはサーバーのユーザー名とパスワードを指定していないので、接続には資格情報の認証がないようです。 「UID = uname; PWD = pword;」と入力してください。あなたのparamsで。 – manglano

+1

私の接続はWindows認証によって設定されているので、私は接続で 'Trusted_Connection = yes'を持っています。 – Andrew

関連する問題