簡體   English   中英

如何在python腳本功能內部的sql查詢中傳遞多個命令行參數或系統參數?

[英]How to pass multiple command line arguments or system arguments in sql query which is inside the function of python script?

我寫了一個代碼,我想將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

它以我的文件名即distributor.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)   

你在做什么錯。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM