Schema Generator 1.0.2, now with SQL Server support
Posted by Scott Laird Thu, 05 Jan 2006 16:48:46 GMT
I just released a new version of my Rails Schema Generator;. There are two changes in this release:
- Migrations should finally work correctly using either old-style (
1_migrate_to_foo) or new-style (001_migrate_to_foo) numbering. - SQL Server support has been added.
There’s also some support for Oracle hiding in the tree, but it’s disabled as I can’t see a way to get it to work without having all of the Oracle OCI libraries installed. So, if you’re using Oracle with Rails, and you care, try uncommenting the Oracle line in schema_generator.rb and then leave a comment telling me what happens.

Much appreciated.
with rails 1.0 on windows XP I get the following errors:
C:\Projects\workspace\railsapp>ruby script/generate schema Found 2 migration classes Starting migration for InitialSchema Starting migration for InitAdmin Migrations complete. Tables found: 8 Indexes found: 0 Records found: 1 exists db create db/schema.mysql.sql Error: undefined method
each_hash' for #<String:0x3d92fb8> ./script/../config/../vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:325:inselect’ ./script/../config/../vendor/rails/activerecord/lib/activerecord/connectionadapters/mysql_adapter.rb:171:inselect_all' ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:431:infind_by_sql’ ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:395:infind' ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:393:infind’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:502:invalidates_uniqueness_of' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:490:invalidates_each’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:293:ineach' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:293:invalidates_each’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:290:incall' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:769:inrun_validations’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:763:ineach' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:763:inrun_validations’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:727:invalid_without_callbacks' ./script/../config/../vendor/rails/activerecord/lib/active_record/callbacks.rb:306:invalid?’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:697:insave_without_transactions' ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:126:insave’ ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:126:intransaction' ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:91:intransaction’ ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:118:intransaction' ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:126:insave’ ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:450:increate' c:/ruby/lib/ruby/gems/1.8/gems/schema_generator-1.0.2/schema_generator.rb:336:indump’ c:/ruby/lib/ruby/gems/1.8/gems/schemagenerator-1.0.2/schemagenerator.rb:335:ineach' c:/ruby/lib/ruby/gems/1.8/gems/schema_generator-1.0.2/schema_generator.rb:335:indump’ (erb):8:intemplate' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:271:intemplate’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:268:infile' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:219:inopen’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:219:infile' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:218:inopen’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:218:infile' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:268:intemplate’ ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:47:insend' ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:47:insend_actions’ ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:46:ineach' ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:46:insend_actions’ ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:31:inreplay' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:41:ininvoke!’ ./script/../config/../vendor/rails/railties/lib/rails_generator/scripts/../scripts.rb:31:inrun' ./script/../config/../vendor/rails/railties/lib/commands/generate.rb:6 c:/ruby/lib/ruby/site_ruby/1.8/rubygems/loadpath_manager.rb:5:inrequire__’ c:/ruby/lib/ruby/siteruby/1.8/rubygems/loadpathmanager.rb:5:inrequire' script/generate:3 create db/schema.postgresql.sql Error: undefined methodeach_hash’ for # ./script/../config/../vendor/rails/activerecord/lib/activerecord/connectionadapters/mysql_adapter.rb:325:inselect' ./script/../config/../vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:171:inselect_all’ ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:431:infind_by_sql' ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:395:infind’ ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:393:infind' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:502:invalidatesuniquenessof’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:490:invalidates_each' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:293:ineach’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:293:invalidates_each' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:290:incall’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:769:inrun_validations' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:763:ineach’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:763:inrun_validations' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:727:invalidwithoutcallbacks’ ./script/../config/../vendor/rails/activerecord/lib/active_record/callbacks.rb:306:invalid?' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:697:insavewithouttransactions’ ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:126:insave' ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:126:intransaction’ ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:91:intransaction' ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:118:intransaction’ ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:126:insave' ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:450:increate’ c:/ruby/lib/ruby/gems/1.8/gems/schemagenerator-1.0.2/schemagenerator.rb:336:indump' c:/ruby/lib/ruby/gems/1.8/gems/schema_generator-1.0.2/schema_generator.rb:335:ineach’ c:/ruby/lib/ruby/gems/1.8/gems/schemagenerator-1.0.2/schemagenerator.rb:335:indump' (erb):8:intemplate’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:271:intemplate' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:268:infile’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:219:inopen' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:219:infile’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:218:inopen' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:218:infile’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:268:intemplate' ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:47:insend’ ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:47:insend_actions' ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:46:ineach’ ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:46:insend_actions' ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:31:inreplay’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:41:ininvoke!' ./script/../config/../vendor/rails/railties/lib/rails_generator/scripts/../scripts.rb:31:inrun’ ./script/../config/../vendor/rails/railties/lib/commands/generate.rb:6 c:/ruby/lib/ruby/siteruby/1.8/rubygems/loadpathmanager.rb:5:inrequire__' c:/ruby/lib/ruby/site_ruby/1.8/rubygems/loadpath_manager.rb:5:inrequire’ script/generate:3 create db/schema.sqlite.sql Error: undefined methodeach_hash' for #<String:0x3d2d8e8> ./script/../config/../vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:325:inselect’ ./script/../config/../vendor/rails/activerecord/lib/activerecord/connectionadapters/mysql_adapter.rb:171:inselect_all' ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:431:infind_by_sql’ ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:395:infind' ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:393:infind’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:502:invalidates_uniqueness_of' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:490:invalidates_each’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:293:ineach' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:293:invalidates_each’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:290:incall' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:769:inrun_validations’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:763:ineach' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:763:inrun_validations’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:727:invalid_without_callbacks' ./script/../config/../vendor/rails/activerecord/lib/active_record/callbacks.rb:306:invalid?’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:697:insave_without_transactions' ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:126:insave’ ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:126:intransaction' ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:91:intransaction’ ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:118:intransaction' ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:126:insave’ ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:450:increate' c:/ruby/lib/ruby/gems/1.8/gems/schema_generator-1.0.2/schema_generator.rb:336:indump’ c:/ruby/lib/ruby/gems/1.8/gems/schemagenerator-1.0.2/schemagenerator.rb:335:ineach' c:/ruby/lib/ruby/gems/1.8/gems/schema_generator-1.0.2/schema_generator.rb:335:indump’ (erb):8:intemplate' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:271:intemplate’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:268:infile' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:219:inopen’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:219:infile' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:218:inopen’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:218:infile' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:268:intemplate’ ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:47:insend' ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:47:insend_actions’ ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:46:ineach' ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:46:insend_actions’ ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:31:inreplay' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:41:ininvoke!’ ./script/../config/../vendor/rails/railties/lib/rails_generator/scripts/../scripts.rb:31:inrun' ./script/../config/../vendor/rails/railties/lib/commands/generate.rb:6 c:/ruby/lib/ruby/site_ruby/1.8/rubygems/loadpath_manager.rb:5:inrequire__’ c:/ruby/lib/ruby/siteruby/1.8/rubygems/loadpathmanager.rb:5:inrequire' script/generate:3 create db/schema.sqlserver.sql Error: undefined methodeach_hash’ for # ./script/../config/../vendor/rails/activerecord/lib/activerecord/connectionadapters/mysql_adapter.rb:325:inselect' ./script/../config/../vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:171:inselect_all’ ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:431:infind_by_sql' ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:395:infind’ ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:393:infind' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:502:invalidatesuniquenessof’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:490:invalidates_each' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:293:ineach’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:293:invalidates_each' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:290:incall’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:769:inrun_validations' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:763:ineach’ ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:763:inrun_validations' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:727:invalidwithoutcallbacks’ ./script/../config/../vendor/rails/activerecord/lib/active_record/callbacks.rb:306:invalid?' ./script/../config/../vendor/rails/activerecord/lib/active_record/validations.rb:697:insavewithouttransactions’ ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:126:insave' ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:126:intransaction’ ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:91:intransaction' ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:118:intransaction’ ./script/../config/../vendor/rails/activerecord/lib/active_record/transactions.rb:126:insave' ./script/../config/../vendor/rails/activerecord/lib/active_record/base.rb:450:increate’ c:/ruby/lib/ruby/gems/1.8/gems/schemagenerator-1.0.2/schemagenerator.rb:336:indump' c:/ruby/lib/ruby/gems/1.8/gems/schema_generator-1.0.2/schema_generator.rb:335:ineach’ c:/ruby/lib/ruby/gems/1.8/gems/schemagenerator-1.0.2/schemagenerator.rb:335:indump' (erb):8:intemplate’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:271:intemplate' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:268:infile’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:219:inopen' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:219:infile’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:218:inopen' ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:218:infile’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:268:intemplate' ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:47:insend’ ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:47:insend_actions' ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:46:ineach’ ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:46:insend_actions' ./script/../config/../vendor/rails/railties/lib/rails_generator/manifest.rb:31:inreplay’ ./script/../config/../vendor/rails/railties/lib/rails_generator/commands.rb:41:ininvoke!' ./script/../config/../vendor/rails/railties/lib/rails_generator/scripts/../scripts.rb:31:inrun’ ./script/../config/../vendor/rails/railties/lib/commands/generate.rb:6 c:/ruby/lib/ruby/siteruby/1.8/rubygems/loadpathmanager.rb:5:inrequire__' c:/ruby/lib/ruby/site_ruby/1.8/rubygems/loadpath_manager.rb:5:inrequire’ script/generate:3 create db/schema.rbI uncommented the Oracle stuff, and it mostly works - except it’s not adding Primary Key constraints to any of the tables, and while it does create sequences, it doesn’t seem to assign them to their columns.
Also, I tried using an Execute statement and it dies making the mysql schema:
I can email you my source and output, if it would help.
ok, I feel silly - my SQL for that Execute statement was just malformed. In any case, that’s fixed and it’s still not showing up in the schema.
hi scott, great work! :D
btw there’s an issue about adding indexes with options or on multiple columns in the DBMigrator…
I was not able to find another place to track this “defect”.
E