将 pandas 数据帧插入 SQL 临时表

4

我正在尝试在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)

我收到的错误是:

编程错误:(pyodbc编程错误)(“42000”,“[42000] [Microsoft] [ODBC SQL Server Driver] [SQL Server]在数据库'databasename'中拒绝了CREATE TABLE权限。 (262)(SQLExecDirectW)”)[SQL:u“\ nCREATE TABLE [Countries](\n\t[index] BIGINT NULL,\n\t[ISO_Short] VARCHAR(max) NULL\n)\n\n'”]

更新:
我想到的另一个选项是使用Pyodbc将Countries转换为字典,然后将字典值传递到临时表中。 使用此方法,一切正常,直到我尝试将字典传递到临时表。 我使用以下代码来使用此方法:
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())
3个回答

1
这可能听起来有点愚蠢,但看看错误信息:

ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]CREATE TABLE permission denied in database 'databasename'. (262) (SQLExecDirectW)") [SQL: u'\nCREATE TABLE [Countries] (\n\t[index] BIGINT NULL, \n\t[ISO_Short] VARCHAR(max) NULL\n)\n\n'

你有一个名为databasename的数据库吗?由于找不到数据库,它无法创建表。我运行了相同的代码,它完全正常工作。我相信这就是原因。

0

这并不是一个严格的SQLAlchemy问题。您需要从您的DBA那里获取服务器上的“CREATE TABLE”权限,以便为某些用户名和密码使用这些凭据来访问您的数据库。尝试在参数中包含“UID = uname; PWD = pword;”,以使用一组获得授权的凭据。


谢谢您的回复。我已经在SQL Server中测试了创建查询,它运行良好。 - Andrew
尊敬的用户,您的登录参数未指定服务器的用户名和密码,因此连接似乎没有凭据进行身份验证。请在参数中包含“UID = uname; PWD = pword;”以尝试解决问题。 - manglano
1
我的连接是通过Windows身份验证设置的,因此在我的连接中有'Trusted_Connection=yes'。 - Andrew

0

我可能有一个对我有效的解决方案:

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)

df是数据框,您可以在集成之前对其进行任何操作。 - Laurent T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接