summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEgon Valdmees2011-02-08 13:20:11 +0000
committerMarko Kreen2011-05-11 09:39:35 +0000
commit8abaf61c48f72e573d076a585d334d059f71fa14 (patch)
treec811f44fb559ce174bbb8b83dc9a483a5ed851eb
parente24329d95a5bbf5021c7033eada7c8f86d151db9 (diff)
table name and columns change support for full_copy
added support for destination table and columns with different name than source
-rw-r--r--python/skytools/sqltools.py38
1 files changed, 28 insertions, 10 deletions
diff --git a/python/skytools/sqltools.py b/python/skytools/sqltools.py
index d7b6efbd..b8a179be 100644
--- a/python/skytools/sqltools.py
+++ b/python/skytools/sqltools.py
@@ -304,7 +304,7 @@ def magic_insert(curs, tablename, data, fields = None, use_insert = 0, quoted_ta
if curs == None and use_insert == 0:
fmt = "COPY %s (%s) FROM STDIN;\n"
buf.write(fmt % (qtablename, ",".join(qfields)))
-
+
# process data
for row in data:
buf.write(row_func(qtablename, row, fields, qfields))
@@ -377,19 +377,37 @@ class CopyPipe(object):
self.buf.seek(0)
self.buf.truncate()
-def full_copy(tablename, src_curs, dst_curs, column_list = [], condition = None):
+def full_copy(tablename, src_curs, dst_curs, column_list = [], condition = None,
+ dst_tablename = None, dst_column_list = None):
"""COPY table from one db to another."""
- qtable = skytools.quote_fqident(tablename)
- if column_list:
- qfields = ",".join([skytools.quote_ident(f) for f in column_list])
- src = dst = "%s (%s)" % (qtable, qfields)
- else:
- qfields = '*'
- src = dst = qtable
+ # default dst table and dst columns to source ones
+ dst_tablename = dst_tablename or tablename
+ dst_column_list = dst_column_list or column_list[:]
+ if len(dst_column_list) != len(column_list):
+ raise Exception('src and dst column lists must match in length')
+
+ def build_qfields(cols):
+ if cols:
+ return ",".join([skytools.quote_ident(f) for f in cols])
+ else:
+ return "*"
+ def build_statement(table, cols):
+ qtable = skytools.quote_fqident(table)
+ if cols:
+ qfields = build_qfields(cols)
+ return "%s (%s)" % (qtable, qfields)
+ else:
+ return qtable
+
+ dst = build_statement(dst_tablename, dst_column_list)
if condition:
- src = "(SELECT %s FROM %s WHERE %s)" % (qfields, qtable, condition)
+ src = "(SELECT %s FROM %s WHERE %s)" % (build_qfields(cols),
+ skytools.quote_fqident(tablename),
+ condition)
+ else:
+ src = build_statement(tablename, column_list)
if hasattr(src_curs, 'copy_expert'):
sql_to = "COPY %s TO stdout" % src