Write indexes.

This commit is contained in:
Friedrich Lindenberg 2012-03-16 22:56:52 +01:00
parent b62ddfb7ef
commit 2c0f88ea74
2 changed files with 21 additions and 1 deletions

View File

@ -4,13 +4,14 @@ from collections import defaultdict
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy import Integer, UnicodeText, Float, DateTime, Boolean from sqlalchemy import Integer, UnicodeText, Float, DateTime, Boolean
from sqlalchemy.schema import Table, MetaData, Column from sqlalchemy.schema import Table, MetaData, Column, Index
from sqlalchemy.sql import and_, expression from sqlalchemy.sql import and_, expression
from migrate.versioning.util import construct_engine from migrate.versioning.util import construct_engine
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
TABLES = defaultdict(dict) TABLES = defaultdict(dict)
INDEXES = dict()
def connect(url): def connect(url):
""" Create an engine for the given database URL. """ """ Create an engine for the given database URL. """
@ -97,3 +98,18 @@ def create_column(engine, table, name, type):
col = Column(name, type) col = Column(name, type)
col.create(table, connection=engine) col.create(table, connection=engine)
def create_index(engine, table, columns, name=None):
if not name:
sig = abs(hash('||'.join(columns)))
name = 'ix_%s_%s' % (table.name, sig)
if name in INDEXES:
return INDEXES[name]
try:
columns = [table.c[c] for c in columns]
idx = Index(name, *columns)
idx.create(engine)
except:
idx = None
INDEXES[name] = idx
return idx

View File

@ -1,6 +1,7 @@
import logging import logging
from sqlaload.schema import _ensure_columns, _args_to_clause from sqlaload.schema import _ensure_columns, _args_to_clause
from sqlaload.schema import create_index
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -27,6 +28,9 @@ def update_row(engine, table, row, unique, ensure=True, types={}):
return False return False
def upsert(engine, table, row, unique, ensure=True, types={}): def upsert(engine, table, row, unique, ensure=True, types={}):
if ensure:
create_index(engine, table, unique)
if not update_row(engine, table, row, unique, ensure=ensure, types=types): if not update_row(engine, table, row, unique, ensure=ensure, types=types):
add_row(engine, table, row, ensure=ensure, types=types) add_row(engine, table, row, ensure=ensure, types=types)