将pandas数据框插入sqltemp选项卡

2024-10-01 13:39:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在SQL数据库中创建一个临时表,并从pandas数据帧填充该表。我在使用数据框到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 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'

更新:

我想到的另一个选择是使用Pyodbc将国家/地区转换为字典,然后将字典值传递到临时表中。使用这种方法,在我尝试将字典传递到临时表之前,一切都会正常工作。使用此方法,我有以下代码:

^{pr2}$

Tags: importpandassqlserverascreateisoconnection
3条回答

这听起来可能有点傻,但看看错误:

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的数据库?因为找不到数据库,所以无法创建表。我运行了同样的代码,运行得很好。我相信这就是原因

严格来说不是一个SQLAlchemy问题。您需要从您的DBA获得一些用户名和密码在服务器上的“createtable”权限,并使用这些凭据访问您的数据库。尝试在参数中包含“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)

相关问题 更多 >