[英]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.