時々別のSQL文の実行は、ユーザーの結果に影響を与えるだろう、夕方にサイトを使用するユーザーせずにSQLを実行する必要はありません。SQLで多くの文書、多くのSQL文の場合や、手動でファイルごとに非常に面倒になる場合があります。声明は、それは、夕方にSQLファイルの実装のタイミングです。
必要な機能が実装さ:
1. [データベース環境弾性ブロック
2.ディスプレイは、SQLファイルのリストを示してい
3.あなたは、SQLファイルを選択し、デフォルトの表示SQLファイルを選択して交換して、現在のSQLファイルを選択することができます
4. SQLファイルを実行決定し、実行するかどうかを求められます
あなたはSQLファイルを実行した後5、爆弾ボックスが成功促し、失敗の数
6.レコードとエラーログ、エラーログには、時間、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 =を[]