Skip to content

Commit c5288db

Browse files
Merge pull request #70 from xiaochuanyu/master
Added a way to store result in specified variable without printing it.
2 parents af6e92c + b0d6e92 commit c5288db

File tree

5 files changed

+57
-12
lines changed

5 files changed

+57
-12
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,6 @@ nosetests.xml
3333
.mr.developer.cfg
3434
.project
3535
.pydevproject
36+
37+
# Pycharm
38+
/.idea

src/sql/magic.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,10 @@ def execute(self, line, cell='', local_ns={}):
7878
user_ns.update(local_ns)
7979

8080
parsed = sql.parse.parse('%s\n%s' % (line, cell), self)
81+
flags = parsed['flags']
8182
conn = sql.connection.Connection.get(parsed['connection'])
82-
first_word = parsed['sql'].split(None, 1)[:1]
83-
if first_word and first_word[0].lower() == 'persist':
83+
84+
if flags['persist']:
8485
return self._persist_dataframe(parsed['sql'], conn, user_ns)
8586

8687
try:
@@ -104,6 +105,13 @@ def execute(self, line, cell='', local_ns={}):
104105

105106
return None
106107
else:
108+
109+
if flags['result_var']:
110+
result_var = flags['result_var']
111+
print("Returning data to local variable {}".format(result_var))
112+
self.shell.user_ns.update({result_var: result})
113+
return None
114+
107115
#Return results into the default ipython _ variable
108116
return result
109117

@@ -118,10 +126,9 @@ def execute(self, line, cell='', local_ns={}):
118126
def _persist_dataframe(self, raw, conn, user_ns):
119127
if not DataFrame:
120128
raise ImportError("Must `pip install pandas` to use DataFrames")
121-
pieces = raw.split()
122-
if len(pieces) != 2:
129+
if not raw:
123130
raise SyntaxError("Format: %sql [connection] persist <DataFrameName>")
124-
frame_name = pieces[1].strip(';')
131+
frame_name = raw.strip(';')
125132
frame = eval(frame_name, user_ns)
126133
if not isinstance(frame, DataFrame) and not isinstance(frame, Series):
127134
raise TypeError('%s is not a Pandas DataFrame or Series' % frame_name)

src/sql/parse.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,27 @@ def parse(cell, config):
2424
else:
2525
connection = ''
2626
sql = cell
27+
flags, sql = parse_sql_flags(sql.strip())
2728
return {'connection': connection.strip(),
28-
'sql': sql.strip()}
29+
'sql': sql,
30+
'flags': flags}
31+
32+
33+
def parse_sql_flags(sql):
34+
words = sql.split()
35+
flags = {
36+
'persist': False,
37+
'result_var': None
38+
}
39+
if not words:
40+
return (flags, "")
41+
num_words = len(words)
42+
trimmed_sql = sql
43+
if words[0].lower() == 'persist':
44+
print("Persist parsed to True")
45+
flags['persist'] = True
46+
trimmed_sql = " ".join(words[1:])
47+
elif num_words >= 2 and words[1] == '<<':
48+
flags['result_var'] = words[0]
49+
trimmed_sql = " ".join(words[2:])
50+
return (flags, trimmed_sql.strip())

src/tests/test_magic.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,16 @@ def test_multi_sql():
5555
""")
5656
assert 'Shakespeare' in str(result) and 'Brecht' in str(result)
5757

58+
@with_setup(_setup_writer, _teardown_writer)
59+
def test_result_var():
60+
ip.run_cell_magic('sql', '', """
61+
sqlite://
62+
x <<
63+
SELECT last_name FROM writer;
64+
""")
65+
result = ip.user_global_ns['x']
66+
assert 'Shakespeare' in str(result) and 'Brecht' in str(result)
67+
5868
@with_setup(_setup_writer, _teardown_writer)
5969
def test_access_results_by_keys():
6070
assert ip.run_line_magic('sql', "sqlite:// SELECT * FROM writer;")['William'] == (u'William', u'Shakespeare', 1616)
@@ -76,7 +86,6 @@ def test_autolimit():
7686
result = ip.run_line_magic('sql', "sqlite:// SELECT * FROM test;")
7787
assert len(result) == 1
7888

79-
8089
@with_setup(_setup, _teardown)
8190
def test_persist():
8291
ip.run_cell("results = %sql SELECT * FROM test;")

src/tests/test_parse.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,28 @@
66
from IPython.config.configurable import Configurable
77

88
empty_config = Configurable()
9-
9+
default_flags = {'persist': False, 'result_var': None}
1010
def test_parse_no_sql():
1111
assert parse("will:longliveliz@localhost/shakes", empty_config) == \
1212
{'connection': "will:longliveliz@localhost/shakes",
13-
'sql': ''}
13+
'sql': '',
14+
'flags': default_flags}
1415

1516
def test_parse_with_sql():
1617
assert parse("postgresql://will:longliveliz@localhost/shakes SELECT * FROM work",
1718
empty_config) == \
1819
{'connection': "postgresql://will:longliveliz@localhost/shakes",
19-
'sql': 'SELECT * FROM work'}
20+
'sql': 'SELECT * FROM work',
21+
'flags': default_flags}
2022

2123
def test_parse_sql_only():
2224
assert parse("SELECT * FROM work", empty_config) == \
2325
{'connection': "",
24-
'sql': 'SELECT * FROM work'}
26+
'sql': 'SELECT * FROM work',
27+
'flags': default_flags}
2528

2629
def test_parse_postgresql_socket_connection():
2730
assert parse("postgresql:///shakes SELECT * FROM work", empty_config) == \
2831
{'connection': "postgresql:///shakes",
29-
'sql': 'SELECT * FROM work'}
32+
'sql': 'SELECT * FROM work',
33+
'flags': default_flags}

0 commit comments

Comments
 (0)