作者 主題: Python & MySQL 抓 OCS Inventory 資料庫問題  (閱讀 2045 次)

0 會員 與 1 訪客 正在閱讀本文。

sclin2k

  • 懷疑的國中生
  • **
  • 文章數: 73
    • 檢視個人資料
先聲明;下列程式是從網路上抄來的

原先的程式是將所有人的電腦設備資料寫入同一 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 時,代入使用者變數?



« 上次編輯: 2018-01-26 17:32 由 sclin2k »

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17394
    • 檢視個人資料
    • http://www.study-area.org
Re: Python & MySQL 抓 OCS Inventory 資料庫問題
« 回覆 #1 於: 2018-01-30 15:26 »
我對DB不熟,不知道是否要定義schema?

sclin2k

  • 懷疑的國中生
  • **
  • 文章數: 73
    • 檢視個人資料
Re: Python & MySQL 抓 OCS Inventory 資料庫問題
« 回覆 #2 於: 2018-01-30 15:48 »
我有找到一篇寫到,當傳入變數且是用 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


« 上次編輯: 2018-01-30 15:53 由 sclin2k »

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5384
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: Python & MySQL 抓 OCS Inventory 資料庫問題
« 回覆 #3 於: 2018-01-31 09:48 »
1. 一般程式語言, 變數名放到字串內, 就是那個字串, 並不會是變數, 所以你的第一個方法, 那就只是字串.
and A.TAG like GsheetName" 改成  and A.TAG like '" + GsheetName + "'" 應該就可以.
2. 第二個函式裡頭應該會對 % 處理 (類似 C 裡頭的 printf), 所以字串的 %Hotfix% 會把 %H 拿來處理, 但又沒定義 %H 是什麼. 通常這種 % 字元, 要改成 \% 或 %% 跳脫才會被當成 % 字元 (我不確定 python 裡頭的這個會用那個方式)

sclin2k

  • 懷疑的國中生
  • **
  • 文章數: 73
    • 檢視個人資料
Re: Python & MySQL 抓 OCS Inventory 資料庫問題
« 回覆 #4 於: 2018-01-31 10:28 »
感謝 twu2 的幫忙!

依照你第一點的方式修改已經可以執行了。


非常感謝!!! ;D ;D ;D