|
4 | 4 | from sqlalchemy.types import VARCHAR, NullType |
5 | 5 | from sqlalchemy.ext.compiler import compiles |
6 | 6 | from sqlalchemy.sql.expression import Executable, ClauseElement |
| 7 | +from sqlalchemy.sql.expression import BindParameter |
7 | 8 |
|
8 | 9 |
|
9 | 10 | class RedshiftDialect(PGDialect_psycopg2): |
@@ -80,10 +81,19 @@ def visit_unload_from_select(element, compiler, **kw): |
80 | 81 | ''' Returns the actual sql query for the UnloadFromSelect class |
81 | 82 | ''' |
82 | 83 | return "unload ('%(query)s') to '%(bucket)s' credentials 'aws_access_key_id=%(access_key)s;aws_secret_access_key=%(secret_key)s' delimiter ',' addquotes" % { |
83 | | - 'query': compiler.process(element.select), |
| 84 | + 'query': compiler.process(element.select, unload_select=True, literal_binds=True), |
84 | 85 | 'bucket': element.bucket, |
85 | 86 | 'access_key': element.access_key, |
86 | 87 | 'secret_key': element.secret_key, |
87 | 88 | } |
88 | 89 |
|
89 | | - |
| 90 | +@compiles(BindParameter) |
| 91 | +def visit_bindparam(bindparam, compiler, **kw): |
| 92 | + #print bindparam |
| 93 | + res = compiler.visit_bindparam(bindparam, **kw) |
| 94 | + if 'unload_select' in kw: |
| 95 | + #process param and return |
| 96 | + res = res.replace("'", "\\'") |
| 97 | + return res |
| 98 | + else: |
| 99 | + return res |
0 commit comments