Skip to content

Commit

Permalink
upsert into non pk tables
Browse files Browse the repository at this point in the history
  • Loading branch information
sb2nov committed May 27, 2015
1 parent e6d28f8 commit 82b5f48
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 19 deletions.
9 changes: 4 additions & 5 deletions dataduct/database/parsers/create_table.py
@@ -1,8 +1,8 @@
"""Create SQL parser
"""
from pyparsing import restOfLine
from pyparsing import ParseException
from pyparsing import ZeroOrMore
from pyparsing import restOfLine

from .utils import _all
from .utils import _create
Expand Down Expand Up @@ -65,8 +65,8 @@ def get_base_parser():
table_definition(pyparsing): Parser for create table statements
"""
table_def = get_definition_start() + \
paranthesis_list('raw_fields', field_parser) + \
get_attributes_parser()
paranthesis_list('raw_fields', field_parser) + \
get_attributes_parser()

return table_def

Expand Down Expand Up @@ -129,7 +129,7 @@ def parse_create_table(string):
string(sql): SQL string from a SQL Statement
Returns:
table_data(dict): table_data dictionary for instantiating a table object
table_data(dict): table_data dictionary for instantiating a table
"""
# Parse the base table definitions
table_data = to_dict(get_base_parser().parseString(string))
Expand Down Expand Up @@ -174,4 +174,3 @@ def create_exists_clone(string):
return template.format(temp='TEMP' if result['temporary'] else '',
table_name=result['full_name'],
definition=result['definition'])

39 changes: 25 additions & 14 deletions dataduct/database/table.py
@@ -1,12 +1,15 @@
"""Script containing the table class object
"""
from .parsers import parse_create_table
from .parsers import create_exists_clone
from .sql import SqlScript
from .select_statement import SelectStatement
from ..utils.helpers import stringify_credentials
from .column import Column
from .parsers import create_exists_clone
from .parsers import parse_create_table
from .relation import Relation
from ..utils.helpers import stringify_credentials
from .select_statement import SelectStatement
from .sql import SqlScript

import logging
logger = logging.getLogger(__name__)


def comma_seperated(elements):
Expand Down Expand Up @@ -140,12 +143,18 @@ def temporary_clone_script(self):
columns = comma_seperated(
['%s %s' % (c.column_name, c.column_type) for c in self.columns()])

sql = """CREATE TEMPORARY TABLE {table_name} (
{columns},
PRIMARY KEY( {primary_keys} )
)""".format(table_name=table_name,
columns=columns,
primary_keys=comma_seperated(self.primary_key_names))
if self.primary_keys:
sql = """CREATE TEMPORARY TABLE {table_name} (
{columns},
PRIMARY KEY( {primary_keys} )
)""".format(
table_name=table_name, columns=columns,
primary_keys=comma_seperated(self.primary_key_names))
else:
sql = """CREATE TEMPORARY TABLE {table_name} (
{columns}
)""".format(
table_name=table_name, columns=columns)

return SqlScript(sql)

Expand All @@ -168,12 +177,13 @@ def rename_script(self, new_name):
"""Sql script to rename the table
"""
return SqlScript(
'ALTER TABLE %s RENAME TO %s' %(self.full_name, new_name))
'ALTER TABLE %s RENAME TO %s' % (self.full_name, new_name))

def delete_script(self, where_condition=''):
"""Sql script to delete from table based on where condition
"""
return SqlScript('DELETE FROM %s %s' %(self.full_name, where_condition))
return SqlScript(
'DELETE FROM %s %s' % (self.full_name, where_condition))

def foreign_key_reference_script(self, source_columns, reference_name,
reference_columns):
Expand Down Expand Up @@ -252,8 +262,9 @@ def de_duplication_script(self):
"""De-duplicate the table to enforce primary keys
"""
if len(self.primary_keys) == 0:
raise RuntimeError(
logger.error(
'Cannot de-duplicate table with no primary keys')
return SqlScript()

script = self.temporary_clone_script()
column_names = [c.name for c in self.columns()]
Expand Down

0 comments on commit 82b5f48

Please sign in to comment.