De Railed <kitesurf27@…> writes:
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