#! /usr/bin/python
###########################################################
#
# Use Gtk.TreeView to browse MySql databases
#
###########################################################
from gi.repository import Gtk
import MySQLdb
import os
class MyWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title='My Window Title')
self.connect('delete-event', Gtk.main_quit)
self.connection = None
self.connect_to_database()
store = Gtk.TreeStore(str, str, str, str)
self.populate_store(store)
self.treeview = Gtk.TreeView(model=store)
renderer = Gtk.CellRendererText()
column_catalog = Gtk.TreeViewColumn('Name', renderer, text=0)
self.treeview.append_column(column_catalog)
self.treeview.connect('test-expand-row', self.add_child_items, store)
scrolled_window = Gtk.ScrolledWindow()
scrolled_window.set_policy(
Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC)
scrolled_window.add(self.treeview)
scrolled_window.set_min_content_height(200)
self.add(scrolled_window)
self.show_all()
def connect_to_database(self):
try:
self.connection = MySQLdb.connect('localhost', 'anon', 'pass')
except MySQLdb.Error, e:
print e.args[1]
# Add databases to TreeStore
def populate_store(self, store):
root_iter = store.append(None, ['localhost', 'server', '', ''])
try:
cursor = self.connection.cursor()
cursor.execute("Select * From `INFORMATION_SCHEMA`.`SCHEMATA`")
rows = cursor.fetchall()
for row in rows:
db_iter = store.append(root_iter, [row[1], 'database', '', ''])
store.append(db_iter, ['dummy', '', '', ''])
except MySQLdb.Error, e:
store.append(root_iter, [e.args[1], '', '', ''])
def add_child_items(self, treeview, iter, path, store):
if iter == None:
return
if store.iter_n_children(iter) == 1:
node_iter = store.iter_nth_child(iter, 0)
if store.get(node_iter, 0)[0] == 'dummy':
store.remove(node_iter)
if store.get(iter, 1)[0] == 'database':
cursor = self.connection.cursor()
db_name = store.get(iter, 0)[0]
tables_iter = store.append(iter, ['tables', '', '', ''])
sql = "Select `TABLE_NAME` From `INFORMATION_SCHEMA`.`TABLES`" \
"Where `TABLE_SCHEMA` = '{0}' " \
"And `TABLE_TYPE` = 'BASE TABLE'".format(db_name)
print sql
cursor.execute(sql)
rows = cursor.fetchall()
for row in rows:
table_iter = store.append(tables_iter, [row[0], 'table', db_name, ''])
store.append(table_iter, ['dummy', '', '', ''])
views_iter = store.append(iter, ['views', '', '', ''])
sql = "Select `TABLE_NAME` From `INFORMATION_SCHEMA`.`TABLES`" \
"Where `TABLE_SCHEMA` = '{0}'" \
"And `TABLE_TYPE` Like '%VIEW%'".format(db_name)
print sql
cursor.execute(sql)
rows = cursor.fetchall()
for row in rows:
view_iter = store.append(views_iter, [row[0], 'table', db_name, ''])
store.append(view_iter, ['dummy', '', '', ''])
if store.get(iter, 1)[0] == 'table':
columns_iter = store.append(iter, ['columns', '', '', ''])
db_name = store.get(iter, 2)[0]
table_name = store.get(iter, 0)[0]
sql = "Select `COLUMN_NAME` From `INFORMATION_SCHEMA`.`COLUMNS` " \
"Where `TABLE_SCHEMA` = '{0}' " \
"And `TABLE_NAME` = '{1}'" \
"Order By `ORDINAL_POSITION`".format(db_name, table_name)
cursor = self.connection.cursor()
cursor.execute(sql)
rows = cursor.fetchall()
for row in rows:
store.append(columns_iter, [row[0], 'column', '', ''])
win = MyWindow()
Gtk.main()