サブクエリで抽出された結果で update

python , flask による自作のプログラムが動かなくなりました。
所詮は自作なので。

最近、linux mint 20.3 をクリーンインストールしたので、flask がどこの行ったのかわからなくなりました。

でも単純な構造なので、エラーの箇所がすぐにわからないといけません。

調べてみるととても単純なエラーではありました。

no such file or directory

いつものエラーコードです。

多分、プログラムで指定した箇所に dicom ファイルがないんでしょう。

flask では ftp で dicom ファイルをローカルにダウンロードするようになっています。

そもそも ftp があまり良くわかっていません。

ftp でログインしてみます。

ftp> 
open 192.168.0.11

ユーザー名とパスワードを入力してログインしてリストを見ると、すぐに pDICOM が見えています。
このディレクトリに dicom ファイルが入っています。


drwxrwxrwx   1 1000     1000             4096 Apr 30 21:40 web
d---------   1 root     root             4096 May 24 15:28 video
drwxrwxrwx   1 138862   138862           4096 Apr  6 16:02 photo
d---------   1 root     root             4096 May 07  2020 music
d---------   1 root     root             4096 May 27 20:14 document
d---------   1 root     root             4096 May 21 07:42 backup
drwxrwxrwx   1 root     root             4096 May 21 23:20 temp
drwxrwxrwx   1 root     root             4096 May 19 08:31 pDICOM
drwxrwxrwx   1 root     root             4096 Apr 11  2021 NetBackup
drwxrwxrwx   1 root     root             4096 Dec 30  2021 homes

でも、この構造をちゃんと理解していなかったので、データベースの内容は以下のような感じです。


studyID path	
8196 	/volume1/pDICOM/2019/02/01
8194 	/volume1/pDICOM/2019/02/01
8195 	/volume1/pDICOM/2019/02/01
8200 	/volume1/pDICOM/2019/02/01
8201 	/volume1/pDICOM/2019/02/01

この「/volume1/」を取って、path のあとに studyID をくっつけたい。

いろいろとクエリ

サブクエリを入れ子にすると、とても混乱するので簡単なところから少しずつ複雑にします。


SELECT
    studyID AS tmpstudy, CONCAT(path,'/',studyID) AS tmpath
FROM
    taginfo

これで、tmpath に「/volume1/pDICOM/2019/02/01/8196」という文字列が入ります。

次は、replace によって「/volume1/」を取り除きます。


SELECT tmpstudy, REPLACE(tmpath, '/volume1/', '') AS rpl FROM
    (
    SELECT
        studyID AS tmpstudy, CONCAT(path,'/',studyID) AS tmpath
    FROM
        taginfo
    ) AS aa

そうすると、rpl には「pDICOM/2019/02/01/8196」がセットされます。

次は、抽出した結果を tblB として update します。


UPDATE taginfo, 
    (
        SELECT tmpstudy, REPLACE(tmpath, '/volume1/', '') AS rpl FROM
            (
            SELECT
                studyID AS tmpstudy, CONCAT(path,'/',studyID) AS tmpath
            FROM
                taginfo
            ) AS aa
        ) tblB
SET taginfo.path2=tblB.rpl
WHERE taginfo.studyID=tblB.tmpstudy

このようにすると、path2 には「pDICOM/2019/02/01/8196」という文字列が書き込まれます。

python を書き換える

データベースを上のようにすると、プログラム的にシンプルになりエラー混入が減少すると思います。

プログラム的には、

startWeasis.py

import os
import shutil
import pymysql
from ftplib import FTP

def weasis(studyID):
    targetDir = getPath( studyID )
    print(targetDir)
    if os.path.exists('/tmp/dcmtemp'):
        shutil.rmtree('/tmp/dcmtemp')
    os.mkdir('/tmp/dcmtemp')
    dwn(targetDir)
    os.system('javaws /var/www/html/weasis/weasisStart.jnlp')

def getPath( studyID ):
    conn = pymysql.connect( host='192.168.0.102',
        db='pydcmdb',
        user='heno',  
        password='moheno',
        cursorclass=pymysql.cursors.DictCursor)
    try:
        with conn.cursor() as cursor:
            cursor.execute( "SELECT path2 FROM taginfo WHERE studyID = %s", (studyID), )
            res = cursor.fetchone()
            return res['path2']  
    finally:
        conn.close()  

def dwn(dir):
    ftp = FTP(
        "ipaddress",
        'ftpuser',
        passwd='ftp_pass'
    ) 

    ftp.cwd(dir)         
    files = ftp.nlst('.')       
    for file in files:
        with open('/tmp/dcmtemp/' + file, 'wb') as f:       
            ftp.retrbinary('RETR %s' % file, f.write)       
    ftp.quit()
       
if __name__ == '__main__':
	weasis()

dicom ファイルは「/tmp/dcmtemp」にダウンロードされます。

コマンド ‘javaws’ が見つかりません

もう一つ気をつけるべきなのは、weasis が起動しないことです。


javaws /var/www/html/weasis/weasisStart.jnlp

で起動しないときは、java 8 くらいを用意して以下のようにすればおそらく上のコマンドが起動します。


source /etc/profile
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "$JAVA_HOME/bin/javaws" 1
sudo update-alternatives --set javaws $JAVA_HOME/bin/javaws

セキュリティをあまり気にしなければ、dcm4chee-arc よりはよほど簡単です。