De Railed <kitesurf27@...> writes:
>
> All,
>
> It looks like rake db:schema:dump does not dump primary keys.
> I have some legacy table that don''t follow the convention ie pk
= id
> and
> none of the primary keys for these tables are getting dumped...
>
> Seems strange as this should be readily available from the db. I am
> using
> MySQL. Is anybody else seeing that ?
>
> Incidentally how does one specify a primary key using migrations ?
>
> Thanks to all
>
Migration:
class CreateMyTables < ActiveRecord::Migration
def self.up
create_table :my_tables, :primary_key => :guid do |t|
t.column :name, :string
end
change_column :my_tables, :guid, :string
end
def self.down
drop_table :my_tables
end
end
Results:
shiny:~/rails/keys damon$ rake migrate
(in /Users/damon/rails/keys)
== CreateMyTables: migrating =================================================--
create_table(:my_tables, {:primary_key=>:guid})
-> 0.3686s
-- change_column(:my_tables, :guid, :string)
-> 0.6069s
== CreateMyTables: migrated (0.9870s) ========================================
shiny:~/rails/keys damon$ cat db/schema.rb
# This file is autogenerated. Instead of editing this file, please use the
# migrations feature of ActiveRecord to incrementally modify your database, and
# then regenerate this schema definition.
ActiveRecord::Schema.define(:version => 1) do
create_table "my_tables", :id => false, :force => true do |t|
t.column "guid", :string, :default => "", :null =>
false
t.column "name", :string
end
end
shiny:~/rails/keys damon$ rake db:structure:dump
(in /Users/damon/rails/keys)
shiny:~/rails/keys damon$ cat db/development_structure.sql
CREATE TABLE `my_tables` (
`guid` varchar(255) NOT NULL default '''',
`name` varchar(255) default NULL,
PRIMARY KEY (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `schema_info` (
`version` int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Notice the difference between the two dumps. Structure dump has the correct
primary key. Schema dump does not. Essentially, you''re being punished
for not
using ''id''. :) What''s wrong with you? ;)
Actually, the schema dumper (schema_dumper.rb) has support for non-id primary
keys with these lines:
--
if @connection.respond_to?(:pk_and_sequence_for)
pk, pk_seq = @connection.pk_and_sequence_for(table)
end
pk ||= ''id''
tbl.print " create_table #{table.inspect}"
if columns.detect { |c| c.name == pk }
if pk != ''id''
tbl.print %Q(, :primary_key => "#{pk}")
end
else
tbl.print ", :id => false"
--
However, the mysql adapter does not have this method, so '':id =>
false'' winds up
in the dump. It seems like you could patch the mysql adapter to support that
method and it should work. If you get something that works, you could submit it
as a patch.
More details about using migrations can be found in my RailsConf presentation at
http://damonclinkscales.com/slides/agilemigrations-railsconf.pdf
Best,
-damon