[Dbix-class] Versioned Cluelessness

Christopher Laco claco at chrislaco.com
Tue Jul 8 04:49:26 BST 2008


Christopher Laco wrote:
> I thought this would be easy. Apparently I'm stupid.
> 
> I have a schema, which has a $VERSION. I've loaded the Versioned 
> component and created two scripts. The first script simply calls 
> $schema->create_ddl_dir with the current/prev versions and directory. 
> The second script simply calls $schema->upgrade
> 
> I've had no issues creating the versioned sql files themselves; both for 
> each version (Schema-1.sql, Schema-2.sql) and for the diffs between 
> versions (Schema-1-2.sql). Those files contain nothing extraordinary. I 
> just added column.
> 
> What has me stumnped is the initial deploy. If I simply do:
> 
>   $schema->connect('dbi:SQLite:database.db')->upgrade;
> 
> I get warnings about the db not being versioned, and then the versioned 
> table is created. However, no other schema tables are created. I thought 
> that update() by itself ran all statements (run_upgrade sets ||= qr//;)
> 
> I know Versioned is finding the right upgrade_directory because if I 
> upgrade to a non-existing .sql file version, if bitches about not 
> finding the file (but it does find 1-2*.sql from above).
> 
> Yes, I'm using SQLite, but the upgrade does a simple alter. No indexes 
> or any other odd magic are involved it would seem.
> 
> What am I missing?
> 
> -=Chris

It appears the you really need to either deploy initially, or start with 
  a version 0 first.

When I get past that, running an $schema->upgrade() from version 1 to 
version 2 croaks:

> claco at mbp ~/mvc-marathon/catalyst/BurningPlate $ script/*upgrade.pl dbi:SQLite:burning_plate.db
> Versions out of sync. This is 2, your database contains version 1, please call upgrade on your Schema.
> Reg: (?i-xsm:create)
> Statements: CREATE TEMPORARY TABLE restaurants_temp_alter (  id INTEGER PRIMARY KEY NOT NULL,  name VARCHAR(100) NOT NULL,  foo VARCHAR(5))
> CREATE TABLE restaurants (  id INTEGER PRIMARY KEY NOT NULL,  name VARCHAR(100) NOT NULL,  foo VARCHAR(5))
> DBIx::Class::Storage::DBI::__ANON__(): DBI Exception: DBD::SQLite::db do failed: table restaurants already exists(1) at dbdimp.c line 271 [for Statement "CREATE TABLE restaurants (  id INTEGER PRIMARY KEY NOT NULL,  name VARCHAR(100) NOT NULL,  foo VARCHAR(5))"] at /Users/claco/mvc-marathon/catalyst/BurningPlate/script/../lib/BurningPlate/Schema.pm line 31


upgrade() doesn't appear to run the statements in the same order as they 
appear in the file:

> CREATE TEMPORARY TABLE restaurants_temp_alter (
>   id INTEGER PRIMARY KEY NOT NULL,
>   name VARCHAR(100) NOT NULL,
>   foo VARCHAR(5)
> );
> INSERT INTO restaurants_temp_alter SELECT id, name, foo FROM restaurants;
> DROP TABLE restaurants;
> CREATE TABLE restaurants (
>   id INTEGER PRIMARY KEY NOT NULL,
>   name VARCHAR(100) NOT NULL,
>   foo VARCHAR(5)
> );
> INSERT INTO restaurants SELECT id, name, foo FROM restaurants_temp_alter;
> DROP TABLE restaurants_temp_alter;



despite the advice of:

> NOTE: Since SQL::Translator 0.09000 it is better to just run all statmets in the order given, since the SQL produced is of better quality.




More information about the DBIx-Class mailing list