65 lines
2.0 KiB
Python
Raw Normal View History

2011-12-22 19:03:54 +01:00
import logging
from sqlaload.schema import _ensure_columns, _args_to_clause
from sqlaload.schema import create_index, get_table
2011-12-22 19:03:54 +01:00
log = logging.getLogger(__name__)
def add_row(engine, table, row, ensure=True, types={}):
""" Add a row (type: dict). If ``ensure`` is set, any of
the keys of the row are not table columns, they will be type
guessed and created. """
table = get_table(engine, table)
2011-12-22 19:03:54 +01:00
if ensure:
_ensure_columns(engine, table, row, types=types)
engine.execute(table.insert(row))
def update_row(engine, table, row, unique, ensure=True, types={}):
if not len(unique):
return False
table = get_table(engine, table)
2011-12-22 19:03:54 +01:00
clause = dict([(u, row.get(u)) for u in unique])
if ensure:
_ensure_columns(engine, table, row, types=types)
try:
stmt = table.update(_args_to_clause(table, clause), row)
rp = engine.execute(stmt)
return rp.rowcount > 0
except KeyError, ke:
2012-10-23 14:51:55 +02:00
log.warn("UPDATE: '%s' filter column does not exist: %s", table.name, ke)
2011-12-22 19:03:54 +01:00
return False
def upsert(engine, table, row, unique, ensure=True, types={}):
table = get_table(engine, table)
2012-03-16 22:56:52 +01:00
if ensure:
create_index(engine, table, unique)
2011-12-22 19:03:54 +01:00
if not update_row(engine, table, row, unique, ensure=ensure, types=types):
add_row(engine, table, row, ensure=ensure, types=types)
def update(engine, table, criteria, values, ensure=True, types={}):
table = get_table(engine, table)
2011-12-22 19:03:54 +01:00
if ensure:
_ensure_columns(engine, table, values, types=types)
q = table.update().values(values)
for column, value in criteria.items():
q = q.where(table.c[column]==value)
engine.execute(q)
2012-07-23 15:27:51 +02:00
def delete(engine, table, **kw):
table = get_table(engine, table)
2012-07-23 15:27:51 +02:00
_ensure_columns(engine, table, kw)
qargs = []
try:
for col, val in kw.items():
qargs.append(table.c[col]==val)
except KeyError:
return
q = table.delete()
for k, v in kw.items():
q= q.where(table.c[k]==v)
engine.execute(q)