Skip to content

Commit ac0edff

Browse files
committed
Merge pull request #15 from jasonamyers/feature/parallel
Adding option for parallel to unload command
2 parents 8b8ee55 + eb1d4f9 commit ac0edff

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

redshift_sqlalchemy/dialect.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ class UnloadFromSelect(Executable, ClauseElement):
179179
''' Prepares a RedShift unload statement to drop a query to Amazon S3
180180
http://docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD_command_examples.html
181181
'''
182-
def __init__(self, select, bucket, access_key, secret_key):
182+
def __init__(self, select, bucket, access_key, secret_key, parallel='on'):
183183
''' Initializes an UnloadFromSelect instance
184184
185185
Args:
@@ -188,22 +188,27 @@ def __init__(self, select, bucket, access_key, secret_key):
188188
bucket: The Amazon S3 bucket where the result will be stored
189189
access_key: The Amazon Access Key ID
190190
secret_key: The Amazon Secret Access Key
191+
parallel: If 'ON' the result will be written to multiple files. If
192+
'OFF' the result will write to one (1) file up to 6.2GB before
193+
splitting
191194
'''
192195
self.select = select
193196
self.bucket = bucket
194197
self.access_key = access_key
195198
self.secret_key = secret_key
199+
self.parallel = parallel
196200

197201

198202
@compiles(UnloadFromSelect)
199203
def visit_unload_from_select(element, compiler, **kw):
200204
''' Returns the actual sql query for the UnloadFromSelect class
201205
'''
202-
return "unload ('%(query)s') to '%(bucket)s' credentials 'aws_access_key_id=%(access_key)s;aws_secret_access_key=%(secret_key)s' delimiter ',' addquotes allowoverwrite" % {
206+
return "unload ('%(query)s') to '%(bucket)s' credentials 'aws_access_key_id=%(access_key)s;aws_secret_access_key=%(secret_key)s' delimiter ',' addquotes allowoverwrite parallel %(parallel)s" % {
203207
'query': compiler.process(element.select, unload_select=True, literal_binds=True),
204208
'bucket': element.bucket,
205209
'access_key': element.access_key,
206210
'secret_key': element.secret_key,
211+
'parallel': element.parallel,
207212
}
208213

209214
@compiles(BindParameter)

tests/test_unload_from_select.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ def setUp(self):
1414
def test_basic_unload_case(self):
1515
''' Tests that the simplest type of UnloadFromSelect works
1616
'''
17-
expected_result = "unload ('SELECT count(t1.id) AS count_1 \nFROM t1') to 'cookies' credentials 'aws_access_key_id=cookies;aws_secret_access_key=cookies' delimiter ',' addquotes allowoverwrite"
17+
expected_result = "unload ('SELECT count(t1.id) AS count_1 \nFROM t1') to 'cookies' credentials 'aws_access_key_id=cookies;aws_secret_access_key=cookies' delimiter ',' addquotes allowoverwrite parallel on"
1818
insert = UnloadFromSelect(select([func.count(self.t1.c.id)]), 'cookies', 'cookies', 'cookies')
1919
self.assertEqual(expected_result, str(insert))
20+
21+
def test_parallel_off_unload_case(self):
22+
''' Tests that UnloadFromSelect handles parallel being set to off
23+
'''
24+
expected_result = "unload ('SELECT count(t1.id) AS count_1 \nFROM t1') to 'cookies' credentials 'aws_access_key_id=cookies;aws_secret_access_key=cookies' delimiter ',' addquotes allowoverwrite parallel off"
25+
insert = UnloadFromSelect(select([func.count(self.t1.c.id)]), 'cookies', 'cookies', 'cookies', 'off')
26+
self.assertEqual(expected_result, str(insert))

0 commit comments

Comments
 (0)