技術討論區 > database 討論版
Python & MySQL 抓 OCS Inventory 資料庫問題
(1/1)
sclin2k:
先聲明;下列程式是從網路上抄來的
原先的程式是將所有人的電腦設備資料寫入同一 Google 試算表分頁,但我想將它改寫成依使用者寫入不同的分頁。
目前遇到的問題是在 MySQL select 語法時無法將GsheetName變數代入
但將 GsheetName 換成固定的字串是可以執行的,會產生每個使用者的試算表分頁,但因為 select 是同一使用者名稱,
當然 select 出來、填入的資料也是同一人的資料。
def DB_return(exec_cmd):
connection = mysqldb.connect('localhost', 'ocs', 'passwd', 'ocsdb',charset='utf8');
with connection:
cursor = connection.cursor()
cursor.execute(exec_cmd)
rows_info = cursor.fetchall()
return rows_info
.........................................
.........................................
省略
connection = mysqldb.connect('localhost', 'ocs', 'passwd', 'ocsdb',charset='utf8');
with connection:
cursor = connection.cursor()
cursor.execute("SELECT * FROM accountinfo")
numrows = int(cursor.rowcount)
for i in range(numrows):
row = cursor.fetchone()
GsheetName = row[1] ////抓出使用者 TAG 名稱指定給 GsheetName 使用者變數
rows_accest = DB_return("SELECT DISTINCT \
A.HARDWARE_ID,A.TAG,H.NAME,H.PROCESSORT,H.MEMORY,S.DISKSIZE,M.CAPTION,SF.NAME \
from accountinfo as A \
join hardware as H \
join monitors as M \
join storages as S \
join softwares as SF \
where \
A.HARDWARE_ID=H.ID \
and A.HARDWARE_ID=S.HARDWARE_ID \
and S.TYPE='Fixed hard disk media' \
and A.HARDWARE_ID=M.HARDWARE_ID \
and A.HARDWARE_ID=SF.HARDWARE_ID \
and A.HARDWARE_ID=H.ID \
and SF.NAME not like '%Hotfix%' \
and SF.NAME not like '%Update%' \
and A.TAG like GsheetName") ////select 時無法將變數代入,換成固定的字串是可以的
GSheet_write(GSpreadSheet,GDriveJSON,rows_account_desc,rows_accest,GsheetName) ////這裡的 GsheetName 是可以代入變數,產生不同的使用者分頁
出現的錯誤訊息:
Traceback (most recent call last):
File "OcsAssetUpGoogleExcel2.py", line 137, in <module>
and A.TAG like GsheetName")
File "OcsAssetUpGoogleExcel2.py", line 12, in DB_return
cursor.execute(exec_cmd)
File "/usr/lib64/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
self.errorhandler(self, exc, value)
File "/usr/lib64/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (1054, "Unknown column 'GsheetName' in 'where clause'")
請大家幫忙,要如何修改才能在 select 時,代入使用者變數?
netman:
我對DB不熟,不知道是否要定義schema?
sclin2k:
我有找到一篇寫到,當傳入變數且是用 cursor.execute 執行時,所傳入的變數會被當成是字串,
所以才會造成無法達到 select 所應得到的資料。
不知照我上面貼的程式碼可有解法?
;D ;D ;D 我也承認我也不懂,所以亂搞卡著頭痛 ;D ;D ;D
有試著改變成傳兩個變數進去:
def DB_return2(exec_cmd,Gname):
connection = mysqldb.connect('localhost', 'ocs', 'passwd', 'ocsdb',charset='utf8');
with connection:
cursor = connection.cursor()
cursor.execute(exec_cmd,Gname)
rows_info = cursor.fetchall()
return rows_info
.........................................
.........................................
省略
connection = mysqldb.connect('localhost', 'ocs', 'passwd', 'ocsdb',charset='utf8');
with connection:
cursor = connection.cursor()
cursor.execute("SELECT * FROM accountinfo")
numrows = int(cursor.rowcount)
for i in range(numrows):
row = cursor.fetchone()
GsheetName = row[1] ////抓出使用者 TAG 名稱指定給 GsheetName 使用者變數
rows_accest = DB_return2("SELECT DISTINCT \
A.HARDWARE_ID,A.TAG,H.NAME,H.PROCESSORT,H.MEMORY,S.DISKSIZE,M.CAPTION,SF.NAME \
from accountinfo as A \
join hardware as H \
join monitors as M \
join storages as S \
join softwares as SF \
where \
A.HARDWARE_ID=H.ID \
and A.HARDWARE_ID=S.HARDWARE_ID \
and S.TYPE='Fixed hard disk media' \
and A.HARDWARE_ID=M.HARDWARE_ID \
and A.HARDWARE_ID=SF.HARDWARE_ID \
and A.HARDWARE_ID=H.ID \
and SF.NAME not like '%Hotfix%' \
and SF.NAME not like '%Update%' \
and A.TAG like", GsheetName)
結果變成下列的錯誤訊息:
[root@ocs ~]# python OcsAssetUpGoogleExcel2.py
Traceback (most recent call last):
File "OcsAssetUpGoogleExcel2.py", line 149, in <module>
and A.TAG like",GsheetName)
File "OcsAssetUpGoogleExcel2.py", line 21, in DB_return2
cursor.execute(exec_cmd, Gname)
File "/usr/lib64/python2.7/site-packages/MySQLdb/cursors.py", line 187, in execute
query = query % tuple([db.literal(item) for item in args])
ValueError: unsupported format character 'H' (0x48) at index 397
twu2:
1. 一般程式語言, 變數名放到字串內, 就是那個字串, 並不會是變數, 所以你的第一個方法, 那就只是字串.
and A.TAG like GsheetName" 改成 and A.TAG like '" + GsheetName + "'" 應該就可以.
2. 第二個函式裡頭應該會對 % 處理 (類似 C 裡頭的 printf), 所以字串的 %Hotfix% 會把 %H 拿來處理, 但又沒定義 %H 是什麼. 通常這種 % 字元, 要改成 \% 或 %% 跳脫才會被當成 % 字元 (我不確定 python 裡頭的這個會用那個方式)
sclin2k:
感謝 twu2 的幫忙!
依照你第一點的方式修改已經可以執行了。
非常感謝!!! ;D ;D ;D
導覽
[0] 文章列表
前往完整版本