2017-08-14 131 views
1

我试图使用dataframe.to_SQL将pandas数据框CAPE插入到SQL Server数据库中。我已经提到以下解决方案来插入行。 PyOdbc fails to connect to a sql server instance。但我在urllib.parse.quote_plus行发生错误。需要帮助在Python中将Pandas Dataframe插入到Sql-server数据库中

任何人都可以帮助提供一个解决方案,以插入数据在Sql服务器数据库。

的源代码:

CAPE # Input dataframe 
    connection = pdc.connect('Driver={SQL Server};''Server=GIRSQL.GIRCAPITAL.com;''Database=Tableau;''uid=SQL_User;pwd=Greentableau!') 
    connection_string = urllib.parse.quote_plus(connection) 
    connection_string = "mssql+pyodbc:///?odbc_connect=%s" % connection_string 
    engine = sq.create_engine(connection_string) 
    CAPE.to_sql(engine, name='[Tableau].[dbo].[Company_Table]',if_exists='replace') 

这是我收到的错误:

Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "C:\Users\Abhay\Python36-32\lib\urllib\parse.py", line 803, in quote_plus 
string = quote(string, safe + space, encoding, errors) 
    File "C:\Users\Abhay\Python36-32\lib\urllib\parse.py", line 787, in quote 
return quote_from_bytes(string, safe) 
    File "C:\Users\Abhay\Python36-32\lib\urllib\parse.py", line 812, in quote_from_bytes 
    raise TypeError("quote_from_bytes() expected bytes") 
    TypeError: quote_from_bytes() expected bytes 
    connection = pdc.connect('Driver={SQL Server};''Server=GIRSQL.GIRCAPITAL.com;''Database=Tableau;''uid=SQL_User;pwd=Greentableau!') 
    connection_string = ur.quote(connection) 
    Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "C:\Users\Abhay\Python36-32\lib\urllib\parse.py", line 787, in quote 
return quote_from_bytes(string, safe) 
    File "C:\Users\Abhay\Python36-32\lib\urllib\parse.py", line 812, in 
quote_from_bytes 
    raise TypeError("quote_from_bytes() expected bytes") 
    TypeError: quote_from_bytes() expected bytes 

样品数据帧值:

 Date Company Value  Category BICS_LEVEL_1_SECTOR_NAME BICS_LEVEL_2_INDUSTRY_GROUP_NAME BICS_LEVEL_3_INDUSTRY_NAME BICS_LEVEL_4_SUB_INDUSTRY_NAME BICS_LEVEL_5_SEGMENT_NAME BICS_REVENUE_LEVEL_ASSIGNED BS_TOT_VAL_OF_SHARES_REPURCHASED COUNTRY COUNTRY_OF_LARGEST_REVENUE EQY_SH_OUT GICS_INDUSTRY_GROUP_NAME  GICS_INDUSTRY_NAME GICS_SECTOR_NAME GICS_SUB_INDUSTRY_NAME  ICB_SECTOR_NAME   INDUSTRY_GROUP INDUSTRY_SECTOR INDUSTRY_SECTOR_NUM  INDUSTRY_SUBGROUP MARKET_SECTOR_DES Real_Earnings Real_Price CAPE_10 Percentile_10_CAPE 
     0 1975-04-30 3M Co  0   EPS    Materials      Chemicals  Specialty Chemicals   Adhesives & Sealants      NaN      10399       3635.82  US    United States 596.767   Capital Goods Industrial Conglomerates  Industrials Industrial Conglomerates General Industrials Miscellaneous Manufactur  Industrial    10011 Diversified Manufact Op   Equity    0   0  NaN     NaN 
     1 1975-04-30 3M Co  0 Stock Price    Materials      Chemicals  Specialty Chemicals   Adhesives & Sealants      NaN      10399       3635.82  US    United States 596.767   Capital Goods Industrial Conglomerates  Industrials Industrial Conglomerates General Industrials Miscellaneous Manufactur  Industrial    10011 Diversified Manufact Op   Equity    0   0  NaN     NaN 
     2 1975-04-30 3M Co  0 Cash Flow    Materials      Chemicals  Specialty Chemicals   Adhesives & Sealants      NaN      10399       3635.82  US    United States 596.767   Capital Goods Industrial Conglomerates  Industrials Industrial Conglomerates General Industrials Miscellaneous Manufactur  Industrial    10011 Diversified Manufact Op   Equity    0   0  NaN     NaN 

我使用的SQL Server版本13.0.4

版本2:

我已更新我的代码。现在,它给sqlalchemy.exc.DBAPIError:

代码:

import pyodbc 
    import sqlalchemy 

    CAFE # sample dataframe 
    engine = sqlalchemy.create_engine("mssql+pyodbc://SQL_User:[email protected]/Tableau?driver=SQL+Server+Native+Client+11.0") 
    engine.connect() 
    CAPE.to_sql(name='[Tableau].[dbo].[Test_table]',con=engine, if_exists='replace') 

Error:

 sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)') 
+0

什么是你的SQL服务器版本? – MaxU

+0

SQL服务器版本13.0.4 –

回答

1

AFAIK没有必要引用一个连接字符串。

这里是从SQL Alchemy online docs一个例子:

engine = create_engine("mssql+pyodbc://scott:[email protected]:port/databasename?driver=SQL+Server+Native+Client+10.0") 

即我们不必调用/使用PyODBC直接 - SQL炼金术会为我们做...

PS the driver name will depend on your SQL Server version...

UPDATE:感谢@ArvinthKumar - here is the connection string that finally worked

engine = create_engine('mssql+pyodbc:///?odbc_connect=DRIVER={SQL Server};SERVER=GIRSQL.GIRCAPITAL.com;DATABASE=Tableau;UID=SQ‌​‌​L_User;PWD=sql_password') 
+0

我已将我的代码更改为以下'params = urllib.parse.quote_plus(“DRIVER = {SQL Server}; SERVER = GIRSQL.GIRCAPITAL.com; DATABASE = Tableau; UID = SQ L_User; PWD = Greentabl eau!“)engine = sqlalchemy.create_engine(”mssql + pyodbc:///?odbc_connect =%s“%params)engine.connect()df.to_sql(name ='[Tableau]。[dbo] 。[Test table]',con = engine,index = False,if_exists ='append')'现在工作正常 –

+1

@ArvinthKumar,感谢您的更新!你是否也可以发布'print(“mssql + pyodbc:///?odbc_connect =%s”%params)“的输出 - 对未来有同样问题的人可能会有所帮助? – MaxU

+1

'print(“mssql + pyodbc:///?odbc_connect =%s”%params)的输出'语句:'引擎(mssql + pyodbc:///?odbc_connect = DRIVER = {SQL Server}; SERVER = GIRSQL。 GIRCAPITAL.com; DATABASE = Tableau; UID = SQL_User; PWD = Greentableau!)' –