Refs: #2675
authorSofia Papagiannaki <papagian@gmail.com>
Tue, 17 Jul 2012 17:57:49 +0000 (20:57 +0300)
committerSofia Papagiannaki <papagian@gmail.com>
Tue, 17 Jul 2012 17:57:49 +0000 (20:57 +0300)
Introduce alembic

snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic.ini [new file with mode: 0644]
snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/README [new file with mode: 0644]
snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/env.py [new file with mode: 0644]
snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/script.py.mako [new file with mode: 0644]
snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/versions/230f8ce9c90f_alter_nodes_add_colu.py [new file with mode: 0644]
snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/versions/8320b1c62d9_create_index_nodes_p.py [new file with mode: 0644]

diff --git a/snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic.ini b/snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic.ini
new file mode 100644 (file)
index 0000000..30eefc1
--- /dev/null
@@ -0,0 +1,50 @@
+# A generic, single database configuration.
+
+[alembic]
+# path to migration scripts
+script_location = alembic
+
+# template used to generate migration files
+# file_template = %%(rev)s_%%(slug)s
+
+# set to 'true' to run the environment during
+# the 'revision' command, regardless of autogenerate
+# revision_environment = false
+
+#sqlalchemy.url = driver://user:pass@localhost/dbname
+sqlalchemy.url = postgresql://pithos@:5432/pithos_prod
+
+# Logging configuration
+[loggers]
+keys = root,sqlalchemy,alembic
+
+[handlers]
+keys = console
+
+[formatters]
+keys = generic
+
+[logger_root]
+level = WARN
+handlers = console
+qualname =
+
+[logger_sqlalchemy]
+level = WARN
+handlers =
+qualname = sqlalchemy.engine
+
+[logger_alembic]
+level = INFO
+handlers =
+qualname = alembic
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[formatter_generic]
+format = %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %H:%M:%S
diff --git a/snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/README b/snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/README
new file mode 100644 (file)
index 0000000..98e4f9c
--- /dev/null
@@ -0,0 +1 @@
+Generic single-database configuration.
\ No newline at end of file
diff --git a/snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/env.py b/snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/env.py
new file mode 100644 (file)
index 0000000..229ed7e
--- /dev/null
@@ -0,0 +1,71 @@
+from __future__ import with_statement
+from alembic import context
+from sqlalchemy import engine_from_config, pool
+from logging.config import fileConfig
+
+# this is the Alembic Config object, which provides
+# access to the values within the .ini file in use.
+config = context.config
+
+# Interpret the config file for Python logging. 
+# This line sets up loggers basically.
+fileConfig(config.config_file_name)
+
+# add your model's MetaData object here
+# for 'autogenerate' support
+# from myapp import mymodel
+# target_metadata = mymodel.Base.metadata
+target_metadata = None
+
+# other values from the config, defined by the needs of env.py,
+# can be acquired:
+# my_important_option = config.get_main_option("my_important_option")
+# ... etc.
+
+def run_migrations_offline():
+    """Run migrations in 'offline' mode.
+
+    This configures the context with just a URL
+    and not an Engine, though an Engine is acceptable
+    here as well.  By skipping the Engine creation
+    we don't even need a DBAPI to be available.
+    
+    Calls to context.execute() here emit the given string to the
+    script output.
+    
+    """
+    url = config.get_main_option("sqlalchemy.url")
+    context.configure(url=url)
+
+    with context.begin_transaction():
+        context.run_migrations()
+
+def run_migrations_online():
+    """Run migrations in 'online' mode.
+
+    In this scenario we need to create an Engine
+    and associate a connection with the context.
+    
+    """
+    engine = engine_from_config(
+                config.get_section(config.config_ini_section), 
+                prefix='sqlalchemy.', 
+                poolclass=pool.NullPool)
+
+    connection = engine.connect()
+    context.configure(
+                connection=connection, 
+                target_metadata=target_metadata
+                )
+
+    try:
+        with context.begin_transaction():
+            context.run_migrations()
+    finally:
+        connection.close()
+
+if context.is_offline_mode():
+    run_migrations_offline()
+else:
+    run_migrations_online()
+
diff --git a/snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/script.py.mako b/snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/script.py.mako
new file mode 100644 (file)
index 0000000..9570201
--- /dev/null
@@ -0,0 +1,22 @@
+"""${message}
+
+Revision ID: ${up_revision}
+Revises: ${down_revision}
+Create Date: ${create_date}
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = ${repr(up_revision)}
+down_revision = ${repr(down_revision)}
+
+from alembic import op
+import sqlalchemy as sa
+${imports if imports else ""}
+
+def upgrade():
+    ${upgrades if upgrades else "pass"}
+
+
+def downgrade():
+    ${downgrades if downgrades else "pass"}
diff --git a/snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/versions/230f8ce9c90f_alter_nodes_add_colu.py b/snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/versions/230f8ce9c90f_alter_nodes_add_colu.py
new file mode 100644 (file)
index 0000000..342c16d
--- /dev/null
@@ -0,0 +1,39 @@
+"""alter nodes add column latest version
+
+Revision ID: 230f8ce9c90f
+Revises: 8320b1c62d9
+Create Date: 2012-07-17 20:32:54.466145
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '230f8ce9c90f'
+down_revision = '8320b1c62d9'
+
+from alembic import op, context
+from sqlalchemy.sql import table, column
+from alembic import op
+
+import sqlalchemy as sa
+
+def upgrade():
+    op.add_column('nodes', sa.Column('latest_version', sa.INTEGER))
+    
+    n = table('nodes', 
+        column('node', sa.Integer),
+        column('latest_version', sa.Integer)
+    )
+    v = table('versions', 
+        column('node', sa.Integer),
+        column('mtime', sa.Integer),
+        column('serial', sa.Integer),
+    )
+    
+    s = sa.select([v.c.serial]).where(n.c.node == v.c.node).order_by(v.c.mtime).limit(1)
+    op.execute(
+        n.update().\
+            values({'latest_version':s})
+            )
+
+def downgrade():
+    op.drop_column('nodes', 'latest_version')
diff --git a/snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/versions/8320b1c62d9_create_index_nodes_p.py b/snf-pithos-backend/pithos/backends/lib/sqlalchemy/alembic/versions/8320b1c62d9_create_index_nodes_p.py
new file mode 100644 (file)
index 0000000..b499ee1
--- /dev/null
@@ -0,0 +1,20 @@
+"""create index nodes.parent
+
+Revision ID: 8320b1c62d9
+Revises: None
+Create Date: 2012-07-17 20:31:18.790919
+
+"""
+
+# revision identifiers, used by Alembic.
+revision = '8320b1c62d9'
+down_revision = None
+
+from alembic import op
+import sqlalchemy as sa
+
+def upgrade():
+    op.create_index('idx_nodes_parent', 'nodes', ['parent'])
+
+def downgrade():
+    op.drop_index('idx_nodes_parent', tablename='nodes')