PythonはSQLファイルを実行するためのさまざまなデータベース環境を選択します

時々別のSQL文の実行は、ユーザーの結果に影響を与えるだろう、夕方にサイトを使用するユーザーせずにSQLを実行する必要はありません。SQLで多くの文書、多くのSQL文の場合や、手動でファイルごとに非常に面倒になる場合があります。声明は、それは、夕方にSQLファイルの実装のタイミングです。

必要な機能が実装さ:

1. [データベース環境弾性ブロック

2.ディスプレイは、SQLファイルのリストを示してい

3.あなたは、SQLファイルを選択し、デフォルトの表示SQLファイルを選択して交換して、現在のSQLファイルを選択することができます

4. SQLファイルを実行決定し、実行するかどうかを求められます

あなたはSQLファイルを実行した後5、爆弾ボックスが成功促し、失敗の数

6.レコードとエラーログ、エラーログには、時間、SQLファイルアドレス、SQLステートメント、SQLエラーの詳細が含まれています

ソース(フォームの一部が含まれており、スクリプトが変更後に[いくつかのパッケージは、削除することができます使用されていない]に含まをインストールするには、ピップの必要性を定期的に作業を行うことができます):

SQLファイルの実行ツール

レンダリングを実現します:

現在、このフォームはフォームコントロールが動作不能、SQLファイルの実装で、その結果、マルチスレッドを使用していないという問題があります。

 

また、これに基づいていくつかの変更は、変更がSQL Pythonスクリプトファイルを実行するタイミングすることができます。

:約スケジュールされたタスクの設定は、この記事を参照することができhttps://blog.csdn.net/wwy11/article/details/51100432

 

コードは、2つの部分に分かれて、あなたはまた、ソースコードをダウンロードすることができます:

最初の部分:初期化形態、ならびに宇宙の様々なを使用する必要

#MyFrameとののカスタムウィンドウクラス
をMyFrame(wx.Frame)のクラス:
    パス= os.path.split(os.path.realpath(ファイル__ __))[0] + "/ SQL" 

    __init __(自己)DEF:

        スーパー()。 __init __(親=なし、タイトル = " SQL文を実行]を選択し、サーバー環境"、サイズ=(800、600))
        self.SetBackgroundColour(wx.Colour(224、224、224))
        self.Center()#設定画面中央に

        #他のコントロールのためにパネルのレイアウトを置く
        パネル= wx.Panel(親=自己)
        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        は、静的なテキストを作成
        スタティック= wx.StaticText(
            パネル、
            ラベル=「選択した実行環境を」
            サイズ=#(150、111) 
        のList1 = [ 
            '開発環境'、 '外部のネットワークテスト環境'、「外部のネットワーク・デプロイメント環境」
        ]
        self.ch1 = wx.ComboBox(
            パネル、
            #-1、
            値= '开发环境'、
            POS =(50、170)、
            サイズ=(150、-1)、
            選択肢= LIST1、
            スタイル= wx.CB_READONLY) 添加事件处理
        self.Bind(wx.EVT_COMBOBOX、self.on_combobox、self.ch1)

        hbox1.Add(
            スタティック、
            #1、
            フラグ= wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE、
            ボーダー= 5)
        hbox1.Add(自己.ch1、
                  1、
                  フラグ= wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE、
                  ボーダー= 5)

        but1 = wx.Button(パネル1 '确定')
        self.Bind(wx.EVT_BUTTON、self.OnSubmit、but1、ID = 1)
        hbox1.Add(but1、
                  1、
                  フラグ= wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE、
                  ボーダー= 5)

        hbox13 = wx.BoxSizer(wx.HORIZONTAL)
        text11 = wx.StaticText(
            パネル、
            ラベル= '选择SQL文件:'、
            サイズ=(100、50)、 
        hbox13.Add( text11、1、フラグ= wx.ALIGN_LEFT、ボーダー= 3)

        butFile = wx.Button(パネル1、U "选择要执行的SQL文件")
        self.Bind(wx.EVT_BUTTON、self.OnSubmit、butFile、ID = 2) 
        hbox13.Add(butFile、9、フラグ= wx.ALIGN_LEFT、ボーダー= 3)
        hbox3 = wx.BoxSizer(wx.HORIZONTAL)
        テキスト1 = wx.StaticText(
            パネル、
            ラベル= 'SQL文件:'、 サイズ=(150、111)、 
        hbox3.Add(
            テキスト1、
            #1、
            フラグ= wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE、
            ボーダー= 5)
        テキスト2 = wx.StaticText(
            パネル、
            ラベル= '(' 
            #サイズ=(150、111) 
        hbox3.Add(
            テキスト2、
            #1、
            フラグ= wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE、
            ボーダー= 5)
复选框(是否全选)
        self.cb3 = wx.CheckBox(パネル、ラベル= '全选'、POS =(10、70))
        self.Bind(wx.EVT_CHECKBOX、self.on_chkboxall、self.cb3)
        hbox3.Add(
            self.cb3、 1、
            フラグ= wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE、
            ボーダー= 5)
        テキスト3 = wx.StaticText(
            パネル、
            ラベル= ')'、
            サイズ=(150、111) 
        hbox3.Add(
            テキスト3、
            #1、
            フラグ= wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE、
            ボーダー= 0) のSQL文件列表
        ファイル= os.listdir(self.path)
        のfileList = []
        ファイル中のFの場合: 
            #添加文件
            もしos.path.splitext(F)[1] .lower()== ".SQL":
                fileList.append(self.path + "\\" + F)

        self.listBox = wx.CheckListBox (パネル、-1、(20、20)、(180、1520)、
                                       のfileList、wx.LB_MULTIPLE)
        self.Bind(wx.EVT_LISTBOX、self.One_Play、self.listBox)
        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        hbox2.Add(self.listBox、
                  1、
                  フラグ= wx.LEFT | wx.RIGHT | wx.FIXED_MINSIZE、
                  ボーダー= 5) 
添加事件处理
        #self.Bind(wx.EVT_CHOICE、self.on_choice、CH 2)
        VBOX = WX .BoxSizer(wx.VERTICAL) 
        vbox.Add(hbox1、割合= 0、フラグ= wx.ALL | wx.EXPAND、ボーダー= 5)
        vbox.Add(hbox13、割合= 0、フラグ= wx.ALL | wx.EXPAND、ボーダー= 5)
        vbox.Add(hbox3、割合= 0、フラグ= wx.ALL | wx.EXPAND、ボーダー= 5)
        VBOX。追加(hbox2、割合= 0、フラグ= wx.ALL | wx.EXPAND、ボーダー= 3)
        panel.SetSizer(VBOX) 
の选择のSQL文件
    デフOnButton1(自己、イベント):
        #filesFilter =「ダイコム(* .SQL) | * .SQL |」"すべてのファイル(*。*)| *。*" 
        filesFilter = "SQLServerの(* .SQL)| * .SQL" 
        は、fileDialog = wx.FileDialog(自己、
                                   メッセージ= "多文件选择"、 
        dialogResult = wx.ID_OK場合は: 
                                   ワイルドカード= filesFilter、
                                   スタイル= wx.FD_OPEN | wx.FD_MULTIPLE)
        dialogResult = fileDialog.ShowModal()
        パス= fileDialog.GetPaths()
        self.listBox.Clear()
        パス内のパスのために:
            self.listBox.Append(パス)
        #选择的文件默认全部选中
        self.cb3.SetValue (真)
        itemsLen = self.listBox.GetCount()
        の範囲内のiについて(itemsLen):
            self.listBox.Check(I、チェック= TRUE) 
全选
    デフon_chkboxall(自己、イベント):
        checkBoxSelected = event.GetEventObject()
        ischk = checkBoxSelected.IsChecked()
        itemsLen = self.listBox.GetCount() 
        私のための範囲(itemsLen)中:
            self.listBox.Check(I、チェック= ischk)

    デフOne_Play(自己、イベント):
        リストボックス= event.GetEventObject()
        seleIndex = event.Selection 
        ischk = self.listBox.IsChecked(seleIndex)
        の場合ischk == TRUE:
            self.listBox.Check(seleIndex、偽=チェック)
        他:
            self.listBox.Check(seleIndex、=真をチェック)

    DEF on_combobox(自己、イベント)
        。プリント( "选择{0}"形式(event.GetString() ))

    デフOnSubmitの(自己、イベント):
        BTN = event.GetEventObject()
        TXT = btn.LabelText  
        txtの場合== "选择要执行的SQL文件":
            filesFilter = "SQLServerの(* .SQL)| * .SQL" 
            は、fileDialog = wx.FileDialog(自己、
                                       メッセージ=「多文件选择」、
                                       ワイルドカード= filesFilter、
                                       スタイル= wx.FD_OPEN | wx.FD_MULTIPLE)
            dialogResult = fileDialog.ShowModal()
            もしdialogResult = wx.ID_OK:!
                リターン・
            パス= fileDialog.GetPaths()
            self.listBox.Clear()
            のパスでパス:
                self.listBox.Append(パス)
            #选择的文件默认全部选中
            self.cb3.SetValue(トゥルー)
            itemsLen = self.listBox.GetCount()
            iに対する範囲(itemsLen)中:
                self.listBox.Check(I、チェック=真) 
        のelif TXTは、 "OK" ==します:
            chvalue = self.ch1.GetValue()

            chvalue場合== "开发环境":
                自己。 MSG = SQLServerの(サーバー= "127.0.0.1"、
                                     ポート= 0、
                                     ユーザ= "テスト"、
                                     =パスワード"Test321"、
                                     データベース= "テスト")
            のelifのchvalue == "外部のネットワークテスト環境":
                self.msg = SQLServerの(サーバー= "127.0.0.1"、
                                     ポート= 0、
                                     ユーザー= "テスト"、
                                     パスワード= " Test321 " 
                                     データベース="テスト")
            のelifのchvalue =="エクストラネット正式環境":
                self.msg = SQLServerの(サーバー=" 127.0.0.1 " 
                                     ポート= 0、
                                     ユーザー="テスト」、
                                     パスワード= "Test321"、 
                #1引数=(seleStr))
                                     データベース= "テスト")

    #selectCount = LEN(self.checkListBox.GetChecked())
    #sqlfiles = self.listBox.GetSelections()
            chkItems = self.listBox.CheckedItems 
            #ループ= asyncio.get_event_loop()

            chkItems内のアイテムの:
                #获取SQL文件路径
                seleStr = self.listBox.Items [アイテム] 
                self.msg.GetSqlInfo(seleStr)
                #1 loop.run_until_complete(self.msg.GetSqlInfo(seleStr))
                #T = multiprocessing.Process(目標= self.msg.GetSqlInfo 、
                #t.daemon = Trueの
                #1 t.start()
                threading.Thread =#(目標= self.msg.GetSqlInfoのTH 
                #=引数(seleStr))
                #th.start()
                #1 wx.CallAfter(self.msg.GetSqlInfo、seleStr)
                time.sleep(1)#の各ファイルの実行後に1秒の時間を一時停止
                (seleStr)#印刷を

            #印刷エラーログ
            #印刷(self.msg.errMsg)
            IF LEN(self.msg.errMsg)> 0:
                ボックス= wx.MessageDialog(
                    なし、「は%sの。SQL文の実行エラーの詳細については、エラーログ'%LEN(self.msg.errMsg)、表示
                    wx.STAY_ON_TOP)|'プロンプト」、wx.OK 
                box.Destroyを() 
                の答え=ボックス.ShowModal()
                box.SetWindowStyle(wx.OK | wx.STAY_ON_TOP)
            他:
                ボックス= wx.MessageDialog(なし、 'が正常に実行されたすべてのSQL文'、 'ヒント'、
                                       wx.OK | wx.STAY_ON_TOP)
                の答え= box.ShowModal()
                box.SetWindowStyle(wx.OK | wx.STAY_ON_TOP)
                ボックス.Destroy()

            #time.sleep(2)
            wx.Exit() 

のDEFのon_choice(セルフ、イベント): プリント( "選択{0}"形式(event.GetString( )))。

 パートII:SQLファイルが読み込まれ、SQLファイルを実行します

SQLServerのクラス:
    たerrMsgアン= [] ファイル名指定されたログファイルの保存、レベル指定されたログレベル
    logging.basicConfig(ファイル名= os.path.split(os.path.realpath( __ファイル__))[0] + "/ sqlErrorInfo.log"、 = logging.infoレベル)

    :__init __(自己、サーバー、ポート、ユーザー、パスワード、データベース)DEF 
        コンストラクタ#クラスの初期化DBC接続情報
        self.server =サーバー
        self.port =ポート
        self.user =ユーザー
        self.passwordパスワード= 
        self.database =データベース

    DEF __GetConnect(セルフ):
        接続情報を取得する#データベース、(conn.cursorを返す)
        self.databaseされていない場合:
            昇給(NameErrorは、 "データベースの情報が設定されていない")
        self.conn pymssql.connect =(サーバー= self.server、 
                                    ポート= self.port、 
                                    ユーザー= self.user、
                                    パスワード= self.password、
                                    データベース= self.database)
        CUR = self.conn.cursor()
        IFないCUR:
            昇給(NameError、 "データベース接続に失敗しました")#DBC CURに割り当てられた情報の
        他に:
            戻りCUR 

    ExecQueryメソッド(セルフ、SQL)DEF:
        「」「
        クエリが実行
        タプルを含むリストを返し、リストは、行要素、行ごとにタプルレコードフィールドの値が記録されている
        「」」
        CUR =自己。 __GetConnect()
        cur.execute(SQL)#クエリ実行
        結果を= cur.fetchall()#1はfetchAllは( ) クエリ結果を取得します
        #クエリは、接続近く完了する
        self.conn.close()
        の戻りが結果取得SQLファイルのSQL文が
    GetSqlInfo(自己、ファイル名をDEF):
 
    DEF Execの(自己、SQLを、ファイル名):
        試してみてください。
            curが=自己.__ GetConnect()
            cur.execute(
                UTF-8を実行するとき、私は問題を経験しているSQL)#
            self.conn.close() 例外を除き、Eなど
            errorMsg内容=「[当前时间:%s]のSQLを文件地址:%S \ nSQL语句:%S \ N错误信息:%S \ n」は%(time.strftime( "%Y-%M-%D%H:%M:%のS"、time.localtime()) 、ファイル名、SQL、E)
            self.errMsg.append(errorMsg内容)
            logging.info(errorMsg内容)
            logging.info( "------------------------ ------------------------------------------ \ N ")

        オープンで(ファイル名、 'R'、エンコーディング= 'GBK'、エラーが= '無視')としてf:
            スクリプトは= f.read()#または任意のエンコーディングがある
            スクリプト= re.sub(R '\ / \ *。 * \ * \ /」、 ''、スクリプト、?
                            フラグ= re.DOTALL)#削除の複数行コメントの
            スクリプト= re.sub(R ' - 。* $'、 ''、スクリプト、
                            フラグ= re.MULTILINE)# 1行コメントの削除

            SQLを= [] 
            do_execute = Falseの
            script.splitの行(uは'N \')について:
                ライン= line.strip()
                ない行場合:
                    継続
                のelif line.upperを()== u'GO ':
                    do_execute =真
                他: 
                    sql.append(ライン)
                    do_execute = line.endswith(U';」) 

                do_executeとフィルタ(なしの場合、
                                         SQL):#は無視した場合のみ、空白行
                    sqlInfo = U '\ n'.join(SQL)#の.encode( "CP1252")
                    #1 sql.append(sqlInfo)
                    self.Exec(
                        sqlInfo、ファイル名
                    、私が経験している)#問題UTF-8実行
                    do_execute = Falseの
                    SQL =を[]

 

 

 

おすすめ

転載: www.cnblogs.com/Health/p/python.html