Fix migration set_length_of_description_field_metering

If PostgreSQL version is less than 9.1.13 migration
set_length_of_description_field_metering fails as there is no
special 'create if not exist' expression. This change add special
function for this case.

Closes-bug: #1348138

Change-Id: Ibe4f370fe400072abd281bd2313261790335eae2
This commit is contained in:
Ann Kamyshnikova 2014-07-22 19:04:00 +04:00
parent 808452913a
commit c0fb42182c
2 changed files with 28 additions and 5 deletions

View File

@ -51,3 +51,18 @@ def alter_enum(table, column, enum_type, nullable):
else:
op.alter_column(table, column, type_=enum_type,
existing_nullable=nullable)
def create_table_if_not_exist_psql(table_name, values):
if op.get_bind().engine.dialect.server_version_info < (9, 1, 0):
op.execute("CREATE LANGUAGE plpgsql")
op.execute("CREATE OR REPLACE FUNCTION execute(TEXT) RETURNS VOID AS $$"
"BEGIN EXECUTE $1; END;"
"$$ LANGUAGE plpgsql STRICT;")
op.execute("CREATE OR REPLACE FUNCTION table_exist(TEXT) RETURNS bool as "
"$$ SELECT exists(select 1 from pg_class where relname=$1);"
"$$ language sql STRICT;")
op.execute("SELECT execute($$CREATE TABLE %(name)s %(columns)s $$) "
"WHERE NOT table_exist(%(name)r);" %
{'name': table_name,
'columns': values})

View File

@ -41,11 +41,19 @@ def upgrade(active_plugins=None, options=None):
if not migration.should_run(active_plugins, migration_for_plugins):
return
op.execute("CREATE TABLE IF NOT EXISTS meteringlabels( "
"tenant_id VARCHAR(255) NULL, "
"id VARCHAR(36) PRIMARY KEY NOT NULL, "
"name VARCHAR(255) NULL, "
"description VARCHAR(255) NULL)")
if op.get_bind().engine.dialect.name == 'postgresql':
migration.create_table_if_not_exist_psql(
'meteringlabels',
"(tenant_id VARCHAR(255) NULL, "
"id VARCHAR(36) PRIMARY KEY NOT NULL, "
"name VARCHAR(255) NULL, "
"description VARCHAR(255) NULL)")
else:
op.execute("CREATE TABLE IF NOT EXISTS meteringlabels( "
"tenant_id VARCHAR(255) NULL, "
"id VARCHAR(36) PRIMARY KEY NOT NULL, "
"name VARCHAR(255) NULL, "
"description VARCHAR(255) NULL)")
op.alter_column('meteringlabels', 'description', type_=sa.String(1024),
existing_nullable=True)