Move from sqlalchemy-migrate to alembic

This affects how columns are added and dropped from
tables. MetaData and SQLATable objects have to be
recreated to make sync changed columns.
This commit is contained in:
Stefan Wehrmeyer 2013-12-18 03:36:15 +01:00
parent 5d3e8b90bf
commit 74b900f1f6
3 changed files with 37 additions and 17 deletions

View File

@ -10,12 +10,14 @@ except ImportError:
from urlparse import parse_qs from urlparse import parse_qs
from sqlalchemy import create_engine from sqlalchemy import create_engine
from migrate.versioning.util import construct_engine
from sqlalchemy.pool import NullPool from sqlalchemy.pool import NullPool
from sqlalchemy.schema import MetaData, Column, Index from sqlalchemy.schema import MetaData, Column, Index
from sqlalchemy.schema import Table as SQLATable from sqlalchemy.schema import Table as SQLATable
from sqlalchemy import Integer, Text, String from sqlalchemy import Integer, Text, String
from alembic.migration import MigrationContext
from alembic.operations import Operations
from dataset.persistence.table import Table from dataset.persistence.table import Table
from dataset.persistence.util import ResultIter from dataset.persistence.util import ResultIter
from dataset.util import DatasetException from dataset.util import DatasetException
@ -42,9 +44,8 @@ class Database(object):
if len(query): if len(query):
url = url + '?' + urlencode(query, doseq=True) url = url + '?' + urlencode(query, doseq=True)
self.schema = schema self.schema = schema
engine = create_engine(url, **kw) self.engine = create_engine(url, **kw)
self.url = url self.url = url
self.engine = construct_engine(engine)
self.metadata = MetaData(schema=schema) self.metadata = MetaData(schema=schema)
self.metadata.bind = self.engine self.metadata.bind = self.engine
if reflectMetadata: if reflectMetadata:
@ -59,6 +60,14 @@ class Database(object):
return self.local.connection return self.local.connection
return self.engine return self.engine
@property
def op(self):
if hasattr(self.local, 'connection'):
ctx = MigrationContext.configure(self.local.connection)
else:
ctx = MigrationContext.configure(self.engine)
return Operations(ctx)
def _acquire(self): def _acquire(self):
self.lock.acquire() self.lock.acquire()
@ -179,6 +188,12 @@ class Database(object):
finally: finally:
self._release() self._release()
def update_table(self, table_name):
self.metadata = MetaData(schema=self.schema)
self.metadata.bind = self.engine
self.metadata.reflect(self.engine)
return SQLATable(table_name, self.metadata)
def get_table(self, table_name, primary_id='id', primary_type='Integer'): def get_table(self, table_name, primary_id='id', primary_type='Integer'):
""" """
Smart wrapper around *load_table* and *create_table*. Either loads a table Smart wrapper around *load_table* and *create_table*. Either loads a table

View File

@ -218,9 +218,11 @@ class Table(object):
self.database._acquire() self.database._acquire()
try: try:
if name not in self.table.columns.keys(): if name not in self.table.columns.keys():
col = Column(name, type) self.database.op.add_column(
col.create(self.table, self.table.name,
connection=self.database.executable) Column(name, type)
)
self.table = self.database.update_table(self.table.name)
finally: finally:
self.database._release() self.database._release()
@ -235,8 +237,11 @@ class Table(object):
self.database._acquire() self.database._acquire()
try: try:
if name in self.table.columns.keys(): if name in self.table.columns.keys():
col = self.table.columns[name] self.database.op.drop_column(
col.drop() self.table.name,
name
)
self.table = self.database.update_table(self.table.name)
finally: finally:
self.database._release() self.database._release()

View File

@ -23,7 +23,7 @@ setup(
zip_safe=False, zip_safe=False,
install_requires=[ install_requires=[
'sqlalchemy >= 0.8.1', 'sqlalchemy >= 0.8.1',
'sqlalchemy-migrate >= 0.7', 'alembic >= 0.6.1',
"argparse >= 1.2.1", "argparse >= 1.2.1",
'python-slugify >= 0.0.6', 'python-slugify >= 0.0.6',
"PyYAML >= 3.10" "PyYAML >= 3.10"