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())
ありがとうございます。私はSQL Serverで作成クエリをテストし、正常に動作します。 – Andrew
確かに、あなたのログインパラメータはサーバーのユーザー名とパスワードを指定していないので、接続には資格情報の認証がないようです。 「UID = uname; PWD = pword;」と入力してください。あなたのparamsで。 – manglano
私の接続はWindows認証によって設定されているので、私は接続で 'Trusted_Connection = yes'を持っています。 – Andrew