如何在python脚本函数内的sql查询中传递多个命令行参数或系统参数?

2024-09-28 21:29:38 发布

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

我已经写了一个代码,我想传递3个命令行或系统参数到sql查询,这是在我所做的函数内。系统参数应该首先传递给函数参数,然后这些参数将传递给函数中的sql查询。这些参数将为该sql查询提供条件。例如:如果我只想获取部门id为1的一月数据,那么命令行参数将是该月份和部门id

我试图从命令行传递agruments,但它将我的文件名作为第一个系统参数。你知道吗

(我的代码):

def main(mon,Id):
    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 a.companyid,CAST(c.gpsdatetime AS DATE) AS GPSDate, 
      AVG(c.tempanalog1) AS AverageTemperature from Vehicle_Master 
      a,GPSEventsData c with(nolock) where a.companyid = c.customerid 
      AND datepart(month,gpsdatetime) = "+str(mon)+"  AND 
      DATEPART(dw,c.gpsdatetime) != 1  AND a.VehicleID = "+str(Id)+"  
      GROUP BY a.companyid, CAST(c.gpsdatetime AS DATE) ORDER BY            
      GPSDate"

     df = pd.read_sql_query(sql, engine)
     df['GPSDate'] = pd.to_datetime(df['GPSDate'])
     g = df.groupby('companyid')

     df['Day'] = g.cumcount() + 1
     newdf = df[['companyid','Day','AverageTemperature']]

     return(newdf.to_sql("DistributorWiseParticularMonth", engine, 
     if_exists="replace"))

 import sys
 if __name__ == "__main__":
 a = sys.argv[0]
 b = sys.argv[1] 
 main(a,b)

我已经从命令行调用了上面的代码,命令如下:

python distributor.py 1, 2

它拿走了我的文件名分配器.py作为第一个参数。 以及我正在传递的实际参数,即1,2作为第二个参数。你知道吗

这是我得到的东西。你知道吗

sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', " 
[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax 
near ','. (102) (SQLExecDirectW)")
[SQL: select a.companyid, CAST(c.gpsdatetime AS DATE) AS GPSDate, 
AVG(c.tempanalog1) AS AverageTemperature from Vehicle_Master 
a,GPSEventsData c with(nolock) where a.companyid = c.customerid and 
datepart(month,gpsdatetime) = distributor.py  AND a.active = 1 and 
c.gpsdatetime >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 12, 0) 
AND c.gpsdatetime < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) AND 
DATEPART(hh,c.gpsdatetime) >= 9 AND DATEPART(hh,c.gpsdatetime) <= 19 AND  
DATEPART(dw,c.gpsdatetime) != 1  AND a.VehicleID = 1,2  GROUP BY 
a.companyid, CAST(c.gpsdatetime AS DATE) ORDER BY GPSDate]
(Background on this error at: http://sqlalche.me/e/f405)   

Tags: and命令行dfsql参数datebyas
1条回答
网友
1楼 · 发布于 2024-09-28 21:29:38

你做错了什么。

sys.argv[0]是脚本的名称。所以当你给它的时候,它会被脚本的名字覆盖。你知道吗

简单修复

读取索引号0后的参数。比如sys.argv[1]sys.argv[2]等等。。你知道吗

另外,Python允许您为变量名分配一系列项(包括列表)。因此,如果希望用户始终提供两个参数,可以将这些参数(作为字符串)赋给两个变量:

user_args = sys.argv[1:]
fun, games = user_args # len(user_args) had better be 2

相关问题 更多 >