Skip to content

Commit

Permalink
Fix Postgresql CSV import for older versions.
Browse files Browse the repository at this point in the history
Postresql's COPY command syntax has changed from 8.x to 9.x. odo uses
the new syntax, which produces a syntax error when running against 8.x
and older. Below is a patch that probes the database version and applies
the correct syntax. It also fixes a (suspected) bug in how encoding is
inferred.
  • Loading branch information
Gilad Arnold committed Oct 13, 2016
1 parent b3b1ed9 commit 22b4c6f
Showing 1 changed file with 49 additions and 26 deletions.
75 changes: 49 additions & 26 deletions odo/backends/sql_csv.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,32 +151,55 @@ def compile_from_csv_postgres(element, compiler, **kwargs):
raise ValueError(
r'PostgreSQL does not support line terminators other than \n'
)
return compiler.process(
sa.text(
"""
COPY {0} FROM :path (
FORMAT CSV,
DELIMITER :delimiter,
NULL :na_value,
QUOTE :quotechar,
ESCAPE :escapechar,
HEADER :header,
ENCODING :encoding
)
""".format(compiler.preparer.format_table(element.element))
).bindparams(
path=os.path.abspath(element.csv.path),
delimiter=element.delimiter,
na_value=element.na_value,
quotechar=element.quotechar,
escapechar=element.escapechar,
header=element.header,
encoding=element.encoding or element.bind(
'show client_encoding'
).execute().scalar()
),
**kwargs
)
postgres_version = element.bind.execute('select version()').scalar()
if int(postgres_version.split()[1].split('.')[0]) >= 9:
return compiler.process(
sa.text(
"""
COPY {0} FROM :path (
FORMAT CSV,
DELIMITER :delimiter,
NULL :na_value,
QUOTE :quotechar,
ESCAPE :escapechar,
HEADER :header,
ENCODING :encoding
)
""".format(compiler.preparer.format_table(element.element))
).bindparams(
path=os.path.abspath(element.csv.path),
delimiter=element.delimiter,
na_value=element.na_value,
quotechar=element.quotechar,
escapechar=element.escapechar,
header=element.header,
encoding=element.encoding or element.bind.execute(
'show client_encoding'
).scalar()
),
**kwargs
)
else:
return compiler.process(
sa.text((
"""
COPY {0} FROM :path
NULL :na_value
DELIMITER :delimiter
CSV %s
QUOTE :quotechar
ESCAPE :escapechar
""" % ('HEADER' if element.header else '')
).format(compiler.preparer.format_table(element.element))
).bindparams(
path=os.path.abspath(element.csv.path),
delimiter=element.delimiter,
na_value=element.na_value,
quotechar=element.quotechar,
escapechar=element.escapechar,
),
**kwargs
)


try:
Expand Down

0 comments on commit 22b4c6f

Please sign in to comment.