想要在 DS223j 跑 python 排程,因此摸索寫了這篇筆記;雖然 DS223j 底層也是 Linux,不過算是變形的 Linux,有其獨特性,所以本筆記的做法都是以不影響安全性及效率為前提。
老人家的 DS223j 系統已更新至 DSM7.2。
因為我的程式要寫連線 DS223j 的 MariaDB,所以需要安裝【pymysql】套件,所以要與系統的 Python3.8.15 分開,另外再安裝 套件中心 的 Python3.9。
* 點選【套件中心】→【所有套件】→ 找到【Python3.9】並點擊安裝
* 以 ssh 連線進入 DS223j,本筆記採用的軟體為 MobaXterm,注意:NAS 和一般 Linux 不同,只允許系統管理者 ssh 連線。
python3.9 的安裝目錄路徑是 /var/packages/Python3.9/target/usr/bin/,執行檔名稱是 python3.9,在下圖中,可以看到套件中心自動為 python3.9 建立了 2 個捷徑,方便我們呼叫執行 python3.9。
# 切換到家目錄 admin@DS223j: cd ~ # 下載並安裝 pip admin@DS223j:~$ wget https://bootstrap.pypa.io/pip/3.9/get-pip.py admin@DS223j:~$ /var/packages/Python3.9/target/usr/bin/python3.9 get-pip.py # 安裝 pymysql admin@DS223j:~$ /var/packages/Python3.9/target/usr/bin/python3.9 -m pip install pymysql
test.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import pymysql
# DS223j 預設關閉了 TCP/IP 連線協定
# 所以改用 socket
def get_db_connection_nas():
"""取得 NAS 資料庫連線"""
# 請根據您的實際設定修改
connection = pymysql.connect(
user='資料庫連線帳號',
password='密碼',
database='資料庫名',
unix_socket='/run/mysqld/mysqld.sock',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor
)
return connection
def execute_and_print_query(pdo_nas, sql: str):
print("\n" + "="*60)
print(f"執行 SQL: {sql}")
print("="*60)
try:
with pdo_nas.cursor() as cursor:
# 執行 SQL 查詢
cursor.execute(sql)
rows = cursor.fetchall()
if rows and len(rows) > 0:
field_names = list(rows[0].keys())
print(f"\n欄位: {', '.join(field_names)}")
print("-"*60)
# 取得記錄總數
total_rows = len(rows)
print(f"\n總共 {total_rows} 筆記錄\n")
# 逐筆 print 出來
for idx, row in enumerate(rows, 1):
print(f"第 {idx} 筆記錄:")
for field, value in row.items():
print(f" {field}: {value}")
print("-"*40)
# 如果沒有記錄
if total_rows == 0:
print("查無任何記錄")
return rows
except Exception as e:
print(f"執行 SQL 時發生錯誤: {e}")
return None
def main():
"""主程式"""
try:
# 建立 mysql 連線
pdo_nas = get_db_connection_nas()
# 查詢記錄
sql = "SELECT * FROM table1"
result1 = execute_and_print_query(pdo_nas, sql)
# 寫入紀錄
sql_insert = f"""INSERT INTO table1
(field1, field2, field3)
VALUES
('欄位1值', '欄位2值', '欄位3值')"""
print(f"sql = {sql_insert}")
pdo_nas.cursor.execute(sql_insert)
pdo_nas.commit()
print("成功寫入")
except Exception as e:
print(f"發生錯誤: {e}")
traceback.print_exc()
if __name__ == "__main__":
main()
在儘量不更動 DS223j 的前提下,不改變 NAS 的環境變數,執行 test.py
# 須完整路徑,但可以是別名(捷徑),所以下面 3 種呼叫方式都行得通 admin@DS223j:/$ /var/packages/Python3.9/target/usr/bin/python3.9 test.py admin@DS223j:/$ /var/packages/Python3.9/target/usr/bin/python3 test.py admin@DS223j:/$ /var/packages/Python3.9/target/usr/bin/python test.py



沒有留言:
張貼留言