Mercurial > hg > sqlex
annotate sqlex/main.py @ 5:3a7f515571dc
can list column names
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Sat, 01 Apr 2017 11:11:28 -0700 |
parents | b440206930ac |
children | 22fbe50d92e8 |
rev | line source |
---|---|
0 | 1 #!/usr/bin/env python |
2 # -*- coding: utf-8 -*- | |
3 | |
4 """ | |
5 sql(ite) explorer/exporter | |
6 """ | |
7 | |
8 # imports | |
9 import argparse | |
5 | 10 import csv |
0 | 11 import os |
12 import sys | |
3 | 13 from .model import SQLEx |
14 | |
0 | 15 |
16 def ensure_dir(directory): | |
17 """ensure a directory exists""" | |
18 if os.path.exists(directory): | |
19 if not os.path.isdir(directory): | |
20 raise OSError("Not a directory: '{}'".format(directory)) | |
21 return directory | |
22 os.makedirs(directory) | |
23 return directory | |
24 | |
25 | |
26 class SQLExParser(argparse.ArgumentParser): | |
27 """CLI option parser""" | |
28 | |
29 def __init__(self, **kwargs): | |
30 kwargs.setdefault('formatter_class', argparse.RawTextHelpFormatter) | |
31 kwargs.setdefault('description', __doc__) | |
32 argparse.ArgumentParser.__init__(self, **kwargs) | |
1 | 33 self.add_argument('db', |
34 help="sqlite `.db` file") | |
4
b440206930ac
stub table optional positional argument
Jeff Hammel <k0scist@gmail.com>
parents:
3
diff
changeset
|
35 self.add_argument('table', nargs='?', |
b440206930ac
stub table optional positional argument
Jeff Hammel <k0scist@gmail.com>
parents:
3
diff
changeset
|
36 help="table to operate on") |
3 | 37 self.add_argument('--tables', '--list-tables', dest='list_tables', |
38 action='store_true', default=False, | |
39 help="list tables and exit") | |
5 | 40 self.add_argument('--columns', '--list-columns', dest='list_columns', |
41 action='store_true', default=False, | |
42 help="list columns in `table` and exit") | |
0 | 43 self.options = None |
44 | |
45 def parse_args(self, *args, **kw): | |
46 options = argparse.ArgumentParser.parse_args(self, *args, **kw) | |
47 self.validate(options) | |
48 self.options = options | |
49 return options | |
50 | |
51 def validate(self, options): | |
52 """validate options""" | |
53 | |
1 | 54 try: |
3 | 55 open(options.db).close() |
1 | 56 except Exception as e: |
57 self.error("Could not open '{}': {}".format(options.db, e)) | |
58 | |
5 | 59 if options.list_columns and not options.table: |
60 self.error("`--list-columns` requires `table`") | |
2 | 61 |
0 | 62 def main(args=sys.argv[1:]): |
63 """CLI""" | |
64 | |
65 # parse command line options | |
66 parser = SQLExParser() | |
67 options = parser.parse_args(args) | |
68 | |
3 | 69 # connect to database |
70 db = SQLEx(options.db) | |
71 | |
72 if options.list_tables: | |
4
b440206930ac
stub table optional positional argument
Jeff Hammel <k0scist@gmail.com>
parents:
3
diff
changeset
|
73 # list tables and return |
b440206930ac
stub table optional positional argument
Jeff Hammel <k0scist@gmail.com>
parents:
3
diff
changeset
|
74 # if `table` argument is provided, exit 1 |
b440206930ac
stub table optional positional argument
Jeff Hammel <k0scist@gmail.com>
parents:
3
diff
changeset
|
75 # if not available. Otherwise exit 0 |
3 | 76 tables = db.tables() |
77 print ('\n'.join(tables)) | |
4
b440206930ac
stub table optional positional argument
Jeff Hammel <k0scist@gmail.com>
parents:
3
diff
changeset
|
78 retval = 0 |
b440206930ac
stub table optional positional argument
Jeff Hammel <k0scist@gmail.com>
parents:
3
diff
changeset
|
79 if options.table: |
b440206930ac
stub table optional positional argument
Jeff Hammel <k0scist@gmail.com>
parents:
3
diff
changeset
|
80 retval = int(options.table not in tables) |
b440206930ac
stub table optional positional argument
Jeff Hammel <k0scist@gmail.com>
parents:
3
diff
changeset
|
81 return retval |
3 | 82 |
5 | 83 if options.table: |
84 # ensure selected table exists | |
85 if options.table not in db.tables(): | |
86 parser.error("No table '{}' in {} tables:\n{}".format(options.table, options.db, ', '.join(db.tables()))) | |
87 | |
88 if options.list_columns: | |
89 # list columns and return | |
90 print ('\n'.join(db.columns(options.table).keys())) | |
91 return | |
92 | |
0 | 93 if __name__ == '__main__': |
94 main() |