summaryrefslogtreecommitdiff
path: root/plac/doc/sql_interface.py
blob: 34042dd82350962b26615bd44d9c96bc52d93353 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import os, plac
from sqlalchemy.ext.sqlsoup import SqlSoup

SQLKEYWORDS = set(['select', 'from', 'inner', 'join', 'outer', 'left', 'right']
                  ) # and many others
DBTABLES = set(['table1', 'table2']) # you can read them from the db schema

COMPLETIONS = SQLKEYWORDS | DBTABLES

class SqlInterface(object):
    commands = ['SELECT']
    def __init__(self, dsn):
        self.soup = SqlSoup(dsn)
    def SELECT(self, argstring):
        sql = 'SELECT ' + argstring
        for row in self.soup.bind.execute(sql):
            yield str(row) # the formatting can be much improved

rl_input = plac.ReadlineInput(
    COMPLETIONS, histfile=os.path.expanduser('~/.sql_interface.history'), 
    case_sensitive=False)

def split_on_first_space(line, commentchar):
    return line.strip().split(' ', 1) # ignoring comments
    
if __name__ == '__main__':
    plac.Interpreter.call(SqlInterface, split=split_on_first_space,
                          stdin=rl_input, prompt='sql> ')