【问题标题】:Insert pandas data frame into SQL temp table将 pandas 数据框插入 SQL 临时表
【发布时间】:2016-07-17 09:12:54
【问题描述】:

我正在尝试在 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 并将 Country 转换为字典,然后将字典值传递到临时表中。使用这种方法,一切正常,直到我尝试将字典传递给临时表。我使用这种方法有以下代码:

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

【问题讨论】:

    标签: python sql-server pandas


    【解决方案1】:

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

    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 的数据库吗?由于找不到数据库,因此无法创建表。我运行了相同的代码,它工作得很好。我相信这就是原因

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的回复。我已经在 SQL Server 中测试了创建查询,它工作正常。
      • 请注意,您的登录参数没有指定服务器的用户名和密码,因此连接似乎没有凭据身份验证。尝试包括“UID=uname;PWD=pword;”在你的参数中。
      • 我的连接是通过 Windows 身份验证设置的,所以我的连接中有“Trusted_Connection=yes”。
      【解决方案3】:

      我可能有适合我的解决方案:

      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 是数据框,你可以在它上面做你想做的事来整合它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      • 2019-04-10
      • 2017-04-02
      相关资源
      最近更新 更多