【问题标题】:How to fetch hourly data of particular date through sql query using for loop by passing python list as an argument or parameter to that sql query?如何通过使用for循环的sql查询通过将python列表作为参数或参数传递给该sql查询来获取特定日期的每小时数据?
【发布时间】:2019-11-15 06:10:38
【问题描述】:

我想使用python通过sql数据库表获取非常大量的一天数据,但是花了很长时间。所以我决定获取部分数据,做一些操作并附加整个结果。为此,我获取了每小时数据,这样服务器就不会花费更长的时间。我将列表设为 l = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21, 22,23,24] 那些项目,即 1 到 24 是小时数,我已经遍历 for 循环并传递给 sql 查询以逐部分获取结果。

以下为参考代码

(我的代码):

l = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]

for i in l:

    quoted = urllib.parse.quote_plus('DRIVER={SQL Server};'
                                       'SERVER=servername;'
                                       'DATABASE=DB;'
                                       'uid=userid;'
                                       'pwd=****;')
    engine = 
      create_engine('mssql+pyodbc:///odbc_connect{}'.format(quoted))
    sql = "select DISTINCT a.companyid, c.RegistrationNo, c.gpsdatetime, c.GPSOdoMeter, 
         c.GroundSpeed, c.TxnReason  from Vehicle_Master a with(nolock), GPSEventsData c 
         with(nolock) where a.RegistrationNo = c.RegistrationNo and a.companyid = c.customerid and 
         a.active = 1 and c.gpsdatetime >= DATEADD(day, DATEDIFF(day, 0, GETDATE()) - 1, 0) and DATEPART(HOUR, c.gpsdatetime) = i ORDER BY gpsdatetime"

    df1 = pd.read_sql_query(sql, engine)"
    df1['ChangeInTime'] = df1.groupby('RegistrationNo')['GPSDateTime'].apply(lambda x: x - 
      x.shift(1))
    df1['GroundSpeed'] = df1['GroundSpeed']*(5/18)
    df1['ChangeInTimeInSec'] = df1['ChangeInTime'].dt.total_seconds()
    df1['ChangeInSpeed'] = df1.groupby('RegistrationNo')['GroundSpeed'].apply(lambda x: x - 
    x.shift(1))
    df1['Acceleration'] =  df1['ChangeInSpeed']/df1['ChangeInTimeInSec']
    df1.to_sql(name="Accelerations_Breaking",schema = 'dbo', con = engine,if_exists = 
    'append',index=False)

以下是它正在抛出的错误:

ProgrammingError: (pyodbc.ProgrammingError) ('42S22', "[42S22] [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'i'. (207) (SQLExecDirectW)") [SQL: select DISTINCT a.companyid, c.RegistrationNo, c.gpsdatetime, c.GPSOdoMeter, c.GroundSpeed, c.TxnReason from Vehicle_Master a with(nolock), GPSEventsData c with(nolock) where a.RegistrationNo = c.RegistrationNo和 a.companyid = c.customerid 和 a.active = 1 和 c.gpsdatetime >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) 和 DATEPART(HOUR, c.gpsdatetime) = i按 gpsdatetime 订购] (此错误的背景:http://sqlalche.me/e/f405

我不知道我哪里错了。
请帮忙!!

【问题讨论】:

    标签: python sql python-3.x python-2.7 python-requests


    【解决方案1】:

    错误提示“列名 'i' 无效”。问题是您的 SQL 中的DATEPART(HOUR, c.gpsdatetime) = ii 在您的 Python 中有一个变量,但您直接在 SQL 字符串中引用它。您应该使用绑定变量,例如 DATEPART(HOUR, c.gpsdatetime) = ?,将该 SQL 转换为 PreparedStatement,或者您的 Python 库调用它的任何内容,然后在您的 Python 中将绑定变量设置为 i 的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多