2026-05-27

【軟體筆記】群暉(Synology) DS223j 設定 MariaDB + Python3 環境

想要在 DS223j 跑 python 排程,因此摸索寫了這篇筆記;雖然 DS223j 底層也是 Linux,不過算是變形的 Linux,有其獨特性,所以本筆記的做法都是以不影響安全性及效率為前提。

老人家的 DS223j 系統已更新至 DSM7.2


* 登入 DS223j web 管理系統 DSM,NAS 本身也有一些系統程式是以 python2 或 python3 撰寫,所以在【套件中心】會看到 python2 顯示已安裝,而 python3 雖然不是已安裝的狀態,但是若以 ssh 登入 DS223j 查看就會發現出廠時系統就安裝了 Python3.8.15

因為我的程式要寫連線 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

 


沒有留言:

張貼留言