前回からやってきた「Pythonでクエリブラウザ」だけど、当初は「Tkinter」で作り始めたけど「wxWidgets」で作り変えることにしました。
画面レイアウトを弄っていくうちに、どうしても「あのグリットがほしいし!」、「アレでなきゃダメだ」、「Tkinter」ではちょっと手間掛かりそうだし、生産効率が落ちてきているのではないか?。これは作るの大変だ!!。と思い始めたので、「wxWidgets」で作り直します。
作り変えるとっても、GUI部分に関連する所なので、クラス化している部分は再利用可能なのでこれまで通りに使用していくよ。
個人的な思いだけど「Tkinter」で作るのに向いているアプリケーション、「wxWidgets」で作るのに向いているアプリケーションがあると思う。
例えば、キーバインドを駆使して作り込む必要があるものや、画面のレイアウトをそれほど意識しなくていいものは「Tkinter」で
見た目が第一でしょう!今風がいいでしょう。とか色々なコンポーネントを使いたい場合は「wxWidgets」がいいと思う。(今回のように)
アプリ作るときに「Tkinter」か「wxWidgets」かを選択するのも悩みどころかな。
そんで、今回も完成していないので、途中経過として載せます。と言っても、あとやろうとしていることは
・select句で指定した項目の項目IDを付加して順番に結果を出す。
・結果をCSVとして保存する。
くらいしか考えていないので、また気が向いたらやろうと思います。
追伸:今回「wxWidgets」にしたことで、SQLを選択範囲して「F1」キー押下で実行する機能が実装できなくなってしまった。。
wxWidgetsを使用するには下記のインストールが必要です。
sudo apt-get install libwxgtk2.8-dev
sudo apt-get install python-wxGTK2.8
画面のイメージは下記のように、前回からちょっと変わった感じ。
接続ボタンクリック→テーブル選択
テーブル選択で右クリックした場合、選択しているテーブルIDをSQL入力エリアに貼付る
結果保存ボタンクリック→ファイル選択ダイアログ表示(保存処理は未実装)
以下ソースデス(時間があるときにGithubに載せます。)
pythonQuery.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # generated by wxGlade 0.6.3 on Tue Mar 20 19:22:38 2012 import wx import wx.grid import sys import os import mysql_python_set_user_data as UsrData import mysql_python_get_tbl_id as UserTbl import mysql_python_sql_setter as SndSql import about as abu # begin wxGlade: extracode # end wxGlade histfile="PythonQuery_hist" #ヒストリファイル class pythonQuery(wx.Frame): def __init__(self, *args, **kwds): # begin wxGlade: pythonQuery.__init__ kwds["style"] = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL wx.Frame.__init__(self, *args, **kwds) # Menu Bar self.frame_2_menubar = wx.MenuBar() self.MFile = wx.Menu() self.MHelp = wx.Menu() self.frame_2_menubar.Append(self.MFile, "File") # MenuFileEnd=self.MFile.Append(wx.ID_EXIT,"終了") # self.frame_2_menubar.Append(self.MHelp, "Help") # MenuHelpAbout=self.MHelp.Append(wx.ID_ABOUT,"About") # self.SetMenuBar(self.frame_2_menubar) # # Menu Bar end self.label_3 = wx.StaticText(self, -1, u"スキーマ選択") self.combo_box_2 = wx.ComboBox(self, -1, choices=[], style=wx.CB_DROPDOWN) self.label_6 = wx.StaticText(self, -1, u"ユーザ") self.text_ctrl_4 = wx.TextCtrl(self, -1, "") self.button_9 = wx.Button(self, -1, u"接続") self.label_4 = wx.StaticText(self, -1, u"パスワード") self.text_ctrl_3 = wx.TextCtrl(self, -1, "", style=wx.TE_PASSWORD) self.grid_1 = wx.grid.Grid(self, -1, size=(1, 1)) self.text_ctrl_1 = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE|wx.HSCROLL) self.button_1 = wx.Button(self, -1, u"SQL\n実行") self.button_5 = wx.Button(self, -1, u"履歴\n削除") self.button_2 = wx.Button(self, -1, u"結果\n削除") self.button_6 = wx.Button(self, -1, u"結果\n保存") self.button_3 = wx.Button(self, -1, u"SQL\n削除") self.button_7 = wx.Button(self, -1, u"予備\nよび") self.button_4 = wx.Button(self, -1, u"履歴\n表示") self.list_box_1 = wx.ListBox(self, -1, choices=[], style=wx.LB_HSCROLL) self.list_box_2 = wx.ListBox(self, -1, choices=[], style=wx.LB_HSCROLL) self.list_box_3 = wx.ListBox(self, -1, choices=[], style=wx.LB_HSCROLL) self.__set_properties() self.__do_layout() self.Bind(wx.EVT_TEXT, self.txt_combo, self.combo_box_2) self.Bind(wx.EVT_TEXT_ENTER, self.ent_combo, self.combo_box_2) self.Bind(wx.EVT_COMBOBOX, self.ev_combo, self.combo_box_2) self.Bind(wx.EVT_BUTTON, self.connect_click, self.button_9) self.Bind(wx.EVT_BUTTON, self.btn1_click, self.button_1) self.Bind(wx.EVT_BUTTON, self.btn5_click, self.button_5) self.Bind(wx.EVT_BUTTON, self.btn2_click, self.button_2) self.Bind(wx.EVT_BUTTON, self.btn6_click, self.button_6) self.Bind(wx.EVT_BUTTON, self.btn3_click, self.button_3) self.Bind(wx.EVT_BUTTON, self.btn7_click, self.button_7) self.Bind(wx.EVT_BUTTON, self.btn4_click, self.button_4) self.Bind(wx.EVT_LISTBOX_DCLICK, self.list1_click, self.list_box_1) self.Bind(wx.EVT_LISTBOX_DCLICK, self.list2_click, self.list_box_2) self.Bind(wx.EVT_LISTBOX_DCLICK, self.list3_click, self.list_box_3) #メニューイベントの定義 self.Bind(wx.EVT_MENU, self.OnClose,MenuFileEnd) #メニュー:終了の処理 self.Bind(wx.EVT_MENU, self.AboutDisp,MenuHelpAbout) #メニュー:情報表示の処理 #キー&マウスイベント(テーブル一覧で右クリックアップした時のイベント) self.list_box_1.Bind(wx.EVT_RIGHT_UP, self.list1_OnMouseRightUp) #キー&マウスイベント(項目一覧で右クリックアップした時のイベント) self.list_box_2.Bind(wx.EVT_RIGHT_UP, self.list2_OnMouseRightUp) #グローバル変数 global histfileNam #履歴ファイル histfileNam="PythonQuery_hist" #SQL入力エリアでのキープレスイベントの定義※※text_ctrl_1を指定すると文字入力できなくなる※※ #self.text_ctrl_1.Bind(wx.EVT_KEY_DOWN, self.Tex1OnkeyPress) #仕方がないのでグリットにカーソル当ててF1ならいける(仕方がない) self.Bind(wx.EVT_KEY_DOWN, self.Tex1OnkeyPress) # end wxGlade #デフォルト値設定 self.text_ctrl_4.SetValue("root") #ユーザID self.text_ctrl_3.SetValue("hogehoge") #パスワード self.combo_box_2.SetValue("mysql") #スキーマ def __set_properties(self): # begin wxGlade: pythonQuery.__set_properties self.SetTitle("PythonQuery") self.SetSize((1220, 647)) self.label_3.SetMinSize((85, 15)) self.combo_box_2.SetMinSize((190, 29)) self.text_ctrl_4.SetMinSize((140, 29)) self.button_9.SetMinSize((50, 29)) self.label_4.SetMinSize((67, 15)) self.text_ctrl_3.SetMinSize((120, 29)) self.grid_1.CreateGrid(0, 0) self.grid_1.SetMinSize((1200, 280)) self.text_ctrl_1.SetMinSize((500, 300)) self.text_ctrl_1.SetToolTipString(u"SQLを入力し、選択した部分を実行します。実行は「F1」、「SQL実行」ボタン") self.list_box_1.SetMinSize((200, 300)) self.list_box_1.SetToolTipString(u"ダブルクリックで項目一覧を表示、右クリックでSQLエリアにテーブルIDを挿入") self.list_box_2.SetMinSize((200, 300)) self.list_box_2.SetToolTipString(u"右クリックでSQLエリアに項目IDを挿入") self.list_box_3.SetMinSize((200, 300)) # end wxGlade def __do_layout(self): # begin wxGlade: pythonQuery.__do_layout sizer_1 = wx.BoxSizer(wx.VERTICAL) sizer_8 = wx.BoxSizer(wx.HORIZONTAL) grid_sizer_1 = wx.GridSizer(4, 2, 0, 0) grid_sizer_3 = wx.GridSizer(7, 7, 0, 0) grid_sizer_3.Add(self.label_3, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_3.Add(self.combo_box_2, 0, 0, 0) grid_sizer_3.Add(self.label_6, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_3.Add(self.text_ctrl_4, 0, 0, 0) grid_sizer_3.Add(self.label_4, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) grid_sizer_3.Add(self.text_ctrl_3, 0, wx.LEFT|wx.FIXED_MINSIZE, 0) grid_sizer_3.Add(self.button_9, 0, 0, 0) sizer_1.Add(grid_sizer_3, 0, 0, 1) sizer_1.Add(self.grid_1, 1, wx.EXPAND, 0) sizer_8.Add(self.text_ctrl_1, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.button_1, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.button_5, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.button_2, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.button_6, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.button_3, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.button_7, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.button_4, 0, wx.EXPAND, 0) sizer_8.Add(grid_sizer_1, 1, wx.EXPAND, 0) sizer_8.Add(self.list_box_1, 0, wx.EXPAND, 0) sizer_8.Add(self.list_box_2, 0, wx.EXPAND, 0) sizer_8.Add(self.list_box_3, 0, wx.EXPAND, 0) sizer_1.Add(sizer_8, 1, wx.EXPAND, 0) self.SetSizer(sizer_1) self.Layout() # end wxGlade #------------------------------------------------------------------------------- #SQL実行ボタン押下時の処理 #------------------------------------------------------------------------------- def btn1_click(self, event): # wxGlade: pythonQuery. print "SQL実行ボタン押下時の処理" self.Execute() event.Skip() #------------------------------------------------------------------------------- #履歴削除ボタン押下時の処理 #------------------------------------------------------------------------------- def btn5_click(self, event): # wxGlade: pythonQuery. print "履歴削除ボタン押下時の処理" if os.path.isfile(histfileNam): #ファイルの存在確認 ret=wx.MessageBox('履歴を削除しちゃうよ!', '履歴削除',wx.YES_NO) #メッセージボックスYESNO if ret == wx.YES: os.remove(histfileNam) #ファイル削除 else: wx.MessageBox('今んとこ履歴は無いよ!', '履歴なし',wx.ICON_ERROR) #メッセージボックス表示 event.Skip() #------------------------------------------------------------------------------- #結果削除ボタン押下時の処理 #------------------------------------------------------------------------------- def btn2_click(self, event): # wxGlade: pythonQuery. print "結果削除ボタン押下時の処理" self.grid_1.DeleteCols(0,99999) #列削除 <最終の取得方法解らない その場しのぎ self.grid_1.DeleteRows(0,99999) #行削除 <最終の取得方法解らない その場しのぎ event.Skip() #------------------------------------------------------------------------------- #結果保存ボタン押下時の処理 #------------------------------------------------------------------------------- def btn6_click(self, event): # wxGlade: pythonQuery. print "結果保存ボタン押下時の処理" #Dir=wx.DirDialog(self, message='保存先のディレクトリを選択',defaultPath ="./")#ファイル保存ダイアログを表示 #ファイル保存ダイアログを表示 Fil=wx.FileDialog(self, message='保存先を選択',defaultDir ="./",style=wx.FD_SAVE) AnsBtn = Fil.ShowModal() dirNam=Fil.GetDirectory() #ディレクトリ名を取得 fileNam=Fil.GetFilename() #ファイル名を取得 print dirNam + "/" + fileNam if fileNam != "": #ファイル存在確認 f = open(fileNam,"w") #ファイルオープン&書込 f.write("ああああ、まだ結果保存出来ません") #1行目の0文字目から最後まで f.close() #ファイルクローズ event.Skip() #------------------------------------------------------------------------------- #SQL削除ボタン押下時の処理 #------------------------------------------------------------------------------- def btn3_click(self, event): # wxGlade: pythonQuery. print "SQL削除ボタン押下時の処理" self.text_ctrl_1.Clear() #テキストエリアをクリア event.Skip() #------------------------------------------------------------------------------- #履歴表示ボタン押下時の処理 #------------------------------------------------------------------------------- def btn4_click(self, event): # wxGlade: pythonQuery. print "履歴表示ボタン押下時の処理" ret=wx.MessageBox('履歴を読込みます', '履歴読込',wx.YES_NO)#メッセージボックスYESNO if ret == wx.YES: if os.path.isfile(histfileNam): #ファイルの存在確認 self.text_ctrl_1.AppendText("\n" + "#-------履歴読込--------" + "\n") for line in open(histfileNam,"r"): self.text_ctrl_1.AppendText(line)#SQL入力エリアの最後に追記する else: wx.MessageBox('履歴ファイルが無いみたい', '履歴読込',wx.ICON_ERROR) event.Skip() #------------------------------------------------------------------------------- #テーブル一覧クリック時の処理 #------------------------------------------------------------------------------- def list1_click(self, event): # wxGlade: pythonQuery. print "テーブル一覧クリック時の処理" usrData = UsrData.UserData(self.text_ctrl_4.GetValue(), self.text_ctrl_3.GetValue(), self.combo_box_2.GetValue()) #項目一覧取得 retK=UserTbl.GetTableId(usrData).getColumns(self.list_box_1.GetStringSelection()) self.list_box_2.Clear() #リストボックスをクリア for tblLine in retK: self.list_box_2.InsertItems(tblLine,0) #項目一覧を取得 #キー情報取得 retK=UserTbl.GetTableId(usrData).getKeyColumns(self.list_box_1.GetStringSelection()) self.list_box_3.Clear() #リストボックスをクリア for tblLine in retK: self.list_box_3.InsertItems(tblLine,0) #項目一覧を取得 event.Skip() #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- def list2_click(self, event): # wxGlade: pythonQuery. print "Event handler `list2_click' not implemented!" event.Skip() #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- def list3_click(self, event): # wxGlade: pythonQuery. print "Event handler `list3_click' not implemented!" event.Skip() #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- def txt_combo(self, event): # wxGlade: pythonQuery. print "Event handler `txt_combo' not implemented" event.Skip() #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- def ent_combo(self, event): # wxGlade: pythonQuery. print "Event handler `ent_combo' not implemented" event.Skip() #------------------------------------------------------------------------------- #コンボボックス変更時のイベント #------------------------------------------------------------------------------- def ev_combo(self, event): # wxGlade: pythonQuery. print "Event handler `ev_combo' not implemented" self.setuzokuu() #接続ボタン押下と同じ処理を行う event.Skip() #------------------------------------------------------------------------------- #接続ボタン押下時の処理 #------------------------------------------------------------------------------- def connect_click(self, event): # wxGlade: pythonQuery. print "接続ボタン押下時の処理" self.setuzokuu() #コンボボックス変更時と同じ処理を行う event.Skip() #------------------------------------------------------------------------------- #テーブルIDでマウスの右クリックUPされた時の処理 #------------------------------------------------------------------------------- def list1_OnMouseRightUp(self,event): print "テーブルIDでマウスの右クリックUPされた時の処理" tblid=self.list_box_1.GetStringSelection() #選択されているテーブルIDを取得 #SQL入力エリアのカーソル位置に挿入 self.text_ctrl_1.SetInsertionPoint(self.text_ctrl_1.GetInsertionPoint()) self.text_ctrl_1.WriteText(tblid + "\n") #SQL入力エリアにテーブルIDを追記する event.Skip() #------------------------------------------------------------------------------- #項目IDでマウスの右クリックUPされた時の処理 #------------------------------------------------------------------------------- def list2_OnMouseRightUp(self,event): print "項目IDでマウスの右クリックUPされた時の処理" kmkid=self.list_box_2.GetStringSelection() #選択されている項目IDを取得 #SQL入力エリアのカーソル位置に挿入 self.text_ctrl_1.SetInsertionPoint(self.text_ctrl_1.GetInsertionPoint()) self.text_ctrl_1.WriteText(kmkid + "\n") #SQL入力エリアに項目IDを追記する event.Skip() #------------------------------------------------------------------------------- #予備ボタン #------------------------------------------------------------------------------- def btn7_click(self, event): # wxGlade: pythonQuery. print "Event handler `btn7_click' not implemented!" #カスタムダイアログを表示しておく show=abu.About(self) ret=show.ShowModal() event.Skip() # end of class pythonQuery #------------------------------------------------------------------------------- #履歴更新の処理 #------------------------------------------------------------------------------- def hist(self,ret_str): f = open(histfileNam,"a") #ファイルオープン&書込 f.write(ret_str + "\n") #選択範囲の文字を渡す f.close() #------------------------------------------------------------------------------- #接続ボタン、コンボボックス変更時の処理 #------------------------------------------------------------------------------- def setuzokuu(self): usrData = UsrData.UserData(self.text_ctrl_4.GetValue(), self.text_ctrl_3.GetValue(), self.combo_box_2.GetValue()) self.list_box_1.Clear() #リストボックスをクリア for tblLine in UserTbl.GetTableId(usrData).getTblId(): #テーブル一覧を取得 self.list_box_1.InsertItems(tblLine,0) #テーブル一覧を設定 self.combo_box_2.Clear() #スキーマ選択クリア for tblLine in UserTbl.GetTableId(usrData).getSchema(): #スキーマ一覧取得 self.combo_box_2.AppendItems(tblLine) #スキーマ選択combo_boxにスキーマ一覧を設定 self.list_box_2.Clear() #リストボックスをクリア #------------------------------------------------------------------------------- #カスタムダイアログ(About)の表示 #------------------------------------------------------------------------------- def AboutDisp(self,event): show=abu.About(self) ret=show.ShowModal() #------------------------------------------------------------------------------- #キープレスの処理:text1エリア #------------------------------------------------------------------------------- def Tex1OnkeyPress(self,event): keycode = event.GetKeyCode() #イベントからキーコードを取得 if keycode == wx.WXK_F1: #F1キーの場合 self.Execute() # else: pass #何もしない #------------------------------------------------------------------------------- #選択範囲のSQLを実行し、結果を返す #------------------------------------------------------------------------------- def Execute(self): usrData = UsrData.UserData(self.text_ctrl_4.GetValue(), self.text_ctrl_3.GetValue(), self.combo_box_2.GetValue()) ret_str=SndSql.SqlSetter(usrData).setSql2(self.text_ctrl_1.GetStringSelection())#SQLの結果取得 t=0 y=0 self.grid_1.DeleteCols(0,99999) #列削除 <最終の取得方法解らない その場しのぎ self.grid_1.DeleteRows(0,99999) #行削除 <最終の取得方法解らない その場しのぎ self.grid_1.AppendCols(len(ret_str[0])) #列追加 for ret1 in ret_str: self.grid_1.AppendRows(1) #1行追加 y=0 for ret2 in ret1: if not isinstance(ret2,str): ret2=str(ret2) #文字型に変換 self.grid_1.SetCellValue(t,y,ret2.encode('utf-8')) y=y+1 t=t+1 print ret_str self.hist(self.text_ctrl_1.GetStringSelection())#履歴更新の処理(選択範囲の文字を渡す) #------------------------------------------------------------------------------- #閉じるボタンの処理 #------------------------------------------------------------------------------- def OnClose(self,event): self.Close(True) #------------------------------------------------------------------------------- if __name__ == "__main__": app = wx.PySimpleApp(0) wx.InitAllImageHandlers() pythonQuery = pythonQuery(None, -1, "") app.SetTopWindow(pythonQuery) pythonQuery.Show() app.MainLoop() |
about.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # generated by wxGlade 0.6.3 on Sat Mar 24 18:34:23 2012 import wx # begin wxGlade: extracode # end wxGlade class About(wx.Dialog): def __init__(self, *args, **kwds): # begin wxGlade: About.__init__ kwds["style"] = wx.DEFAULT_DIALOG_STYLE wx.Dialog.__init__(self, *args, **kwds) self.label_1 = wx.StaticText(self, -1, "PythonQuery", style=wx.ALIGN_CENTRE|wx.ST_NO_AUTORESIZE) self.bitmap_1 = wx.StaticBitmap(self, -1, wx.Bitmap("brokendish_iCON_Kuro.jpg", wx.BITMAP_TYPE_ANY)) self.label_2 = wx.StaticText(self, -1, u"PythonQuery (作成中)\n\n2012 brokendish\n\nhttps://brokendish.org", style=wx.ALIGN_CENTRE) self.button_1 = wx.Button(self, -1, u"閉じる") self.__set_properties() self.__do_layout() #閉じるボタンのイベント self.Bind(wx.EVT_BUTTON, self.OnClose, self.button_1) # end wxGlade def __set_properties(self): # begin wxGlade: About.__set_properties self.SetTitle("About") self.label_1.SetMinSize((282, 61)) self.label_1.SetFont(wx.Font(30, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) # end wxGlade def __do_layout(self): # begin wxGlade: About.__do_layout sizer_3 = wx.BoxSizer(wx.VERTICAL) sizer_3.Add(self.label_1, 0, wx.BOTTOM|wx.EXPAND|wx.ALIGN_BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 0) sizer_3.Add(self.bitmap_1, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) sizer_3.Add(self.label_2, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) sizer_3.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) self.SetSizer(sizer_3) sizer_3.Fit(self) self.Layout() # end wxGlade # end of class About #閉じるボタンの処理 def OnClose(self,event): self.Close(True) if __name__ == "__main__": app = wx.PySimpleApp(0) wx.InitAllImageHandlers() frame_1 = About(None, -1, "") app.SetTopWindow(frame_1) frame_1.Show() app.MainLoop() |
mysql_python_get_tbl_id.py
#! /usr/bin/env python # -*- coding: UTF-8 -*- import MySQLdb as msl import mysql_python_set_user_data as UsrData """ 指定スキーマのテーブル一覧を取得 """ class GetTableId: def __init__(self,UsrData): self.schemaNm=UsrData.schm self.userNm=UsrData.usr self.pwssWd=UsrData.pwd """ テーブルID取得 """ def getTblId(self): connect=msl.connect(passwd=self.pwssWd, user=self.userNm, db=self.schemaNm) cur=connect.cursor() sql_str = 'select table_name from INFORMATION_SCHEMA.TABLES where table_schema=' + '"' + self.schemaNm + '"' print sql_str cur.execute(sql_str) ret_all = cur.fetchall() for inrec in ret_all: #print inrec[0],inrec[1],inrec[3],inrec[4] print inrec[0] cur.close() connect.close() return ret_all """ カラム名取得 """ def getColumns(self,tblid): connect=msl.connect(passwd=self.pwssWd, user=self.userNm, db=self.schemaNm) cur=connect.cursor() sql_str = 'select COLUMN_NAME from INFORMATION_SCHEMA.columns where table_schema=' + '"' + self.schemaNm + '"' + ' and TABLE_NAME = ' + '"' + tblid + '"' + ' order by ordinal_position desc' print sql_str cur.execute(sql_str) ret_all = cur.fetchall() for inrec in ret_all: #print inrec[0],inrec[1],inrec[3],inrec[4] print inrec[0] cur.close() connect.close() return ret_all """ プライマリキー取得 """ def getKeyColumns(self,tblid): connect=msl.connect(passwd=self.pwssWd, user=self.userNm, db=self.schemaNm) cur=connect.cursor() #文字連結に||が使えないので「concat」使用:Mysql依存 sql_str = 'select concat("[",CONSTRAINT_NAME,"]::",COLUMN_NAME) from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where table_name = ' + '"' + tblid + '"' print sql_str cur.execute(sql_str) ret_all = cur.fetchall() for inrec in ret_all: #print inrec[0],inrec[1],inrec[3],inrec[4] print inrec[0] cur.close() connect.close() return ret_all """ スキーマ情報取得 """ def getSchema(self): connect=msl.connect(passwd=self.pwssWd, user=self.userNm, db=self.schemaNm) cur=connect.cursor() sql_str = 'select SCHEMA_NAME from INFORMATION_SCHEMA.SCHEMATA' print sql_str cur.execute(sql_str) ret_all = cur.fetchall() for inrec in ret_all: #print inrec[0],inrec[1],inrec[3],inrec[4] print inrec[0] cur.close() connect.close() return ret_all |
mysql_python_sql_setter.py
#! /usr/bin/env python # -*- coding: UTF-8 -*- import MySQLdb as msl import mysql_python_set_user_data as UsrData """ SQLを発行する """ class SqlSetter: def __init__(self,UsrData): self.schemaNm=UsrData.schm self.userNm=UsrData.usr self.pwssWd=UsrData.pwd def setSql(self,sqlStr): ret_all=[] connect=msl.connect(passwd=self.pwssWd, user=self.userNm, db=self.schemaNm) print sqlStr #SQLを標準出力(デバグ用) #クエリを使用して結果を取得 connect.query(sqlStr) ret=connect.use_result() while(True): """ fetch_row(1,1): 0 -- tuples (default) 1 -- dictionaries, key=column or table.column if duplicated 2 -- dictionaries, key=table.column """ #get_row=ret.fetch_row(1,1) #結果を辞書形式(連想配列)で返す get_row=ret.fetch_row(1,1) #結果を2次元配列で返す if not get_row: break ret_all.insert(0,get_row[0]) connect.close() #接続を切る return ret_all def setSql2(self,sqlStr): ret_all=[] connect=msl.connect(passwd=self.pwssWd, user=self.userNm, db=self.schemaNm) print sqlStr #SQLを標準出力(デバグ用) #カーソルを使って全体を取得する場合(メモリリークが起きることがあるみたい) cur=connect.cursor() #結果を辞書形式(連想配列)で返す #cur=connect.cursor(msl.cursors.DictCursor) cur.execute(sqlStr) #SQL実行 ret_all = cur.fetchall() #フェッチオール(全部取得しておく) cur.close() #カーソルを閉じる connect.close() #接続を切る return ret_all """ ヘッタを付けてタブ区切りにする(CSV出力用) """ def getRetTabStruct(self,ret_str): cati = "" key_list=ret_str[0].viewkeys() #辞書型のキー(項目名)を取得 for head in key_list: cati = cati + head + "\t" #タブ区切りで繋ぐ cati = cati + "\n" #項目名を繋げ終わったら改行 for strr in ret_str: #データ内容を取得 for get_key in key_list: if not isinstance(strr[get_key],str): strr[get_key]=str(strr[get_key])#文字型に変換 cati = cati + strr[get_key] + "\t" #タブ区切りで繋ぐ cati = cati + "\n" #文字列を連結 return cati """ ヘッタを付け2次元配列にする 作成中!作成中!作成中!作成中! """ def getRetStruct(self,ret_str): cati=[[]] key_list=ret_str[0][1].viewkeys() #辞書型のキー(項目名)を取得 for head in key_list: cati.insert(0,head) #ヘッタ部分を配列に挿入 t=1 for strr in ret_str: #データ内容を取得 for get_key in key_list: if not isinstance(strr[get_key],str): strr[get_key]=str(strr[get_key])#文字型に変換 cati.insert(t,head) #データ部分を配列に挿入 t=t+1 return cati |
mysql_python_set_user_data.py
#! /usr/bin/env python # -*- coding: UTF-8 -*- """ ユーザの接続情報を保持する """ class UserData(): def __init__(self,usr,pwd,schm): self.usr = usr self.pwd = pwd self.schm = schm |