将python表写入SQL

时间:2018-05-28 02:07:17

标签: python sql python-3.x pandas

我有pytrends这样的输出:

>>> from pytrends.request import TrendReq
>>> import pandas as pd
>>> import pyodbc as db
<...>
>>> pytrend.interest_over_time()
date        Cat    Dog    Bat    Rat    Roo    IsPartial
2017-05-28   61      1     27     23     24    False
2017-06-04   61      1     25     28     27    False
2017-06-11   64      2     23     22     22    False
2017-06-18   75      3     27     27     26    False

如何将此数据插入到相同的MS SQL表中,如下所示?

CREATE TABLE GoogleTrends (
 [Date] DATE
,[Cat] TINYINT
,[Dog] TINYINT
,[Bat] TINYINT
,[Rat] TINYINT
,[Roo] TINYINT
,[IsPartial] BIT
)

采取的步骤:

>>> con = db.connect('DRIVER={ODBC Driver 13 for SQL Server};SERVER=ServerName;Trusted_Connection=yes;DATABASE=DBName')
>>> cur = con.cursor()

然后应该像

那样
qry = '''INSERT INTO dbo.GoogleTrends
        (Date, Cat, Dog, Bat, Rat, Roo, IsPartial)
        VALUES(?, ?, ?, ?, ?, ?, ?)
        '''

但我不太确定。无论如何,使用

>>>cur.execute(qry, param_values)

导致错误:'SQL包含6个参数标记,但提供了1个参数','HY000'如果我分配

param_values = pytrend.interest_over_time() 

2 个答案:

答案 0 :(得分:0)

由于SQL Server的to_sql需要SQLAlchemy连接而不是原始连接,因此请考虑使用相同的准备SQL语句迭代数据帧行的游标方法:

for idx, row in pytrend.interest_over_time().iterrows():
  cur.execute(qry, row)
  con.commit()

答案 1 :(得分:0)

您不必使用SQLAlchemy,但它是一个选项。 如果你想使用pyodbc,你几乎已经这样做了。

qry = '''INSERT INTO dbo.GoogleTrends
        (Date, Cat, Dog, Bat, Rat, Roo, IsPartial)
        VALUES(?, ?, ?, ?, ?, ?, ?)
        '''
cur.execute(qry ,(Date_val, Cat_val, Dog_val, Bat_val, Rat_val, Roo_val, IsPartial_val))

请注意,execute函数中的第二个参数也接受一个元组。 但是请考虑另外两个注释: 1)你需要自己在sql server中创建表; pyodbc不会为你创建表 2)插入数据后,您需要额外的代码行:

con.commit()