ruby on rails - tutorial - ¿Cómo cargar múltiples esquemas en un motor o aplicación de Rails?
ruby on rails tutorial español (1)
Está utilizando SQLite como su motor de base de datos. Espero que eso es lo que quieres hacer.
Como está creando una base de datos SQLite, las cosas difieren un poco de otros adaptadores de base de datos como MySQLAdpter o Postgress.
En el caso de MySQL, la base de datos debe crearse antes de establecer una conexión gastando los comandos SQL "CREATE DATABASE ...". Entonces debe crear la base de datos antes de establecer la conexión.
Pero en el caso de SQLite, dado que la base de datos reside en un archivo y un archivo puede contener solo una base de datos, no existe un paso separado para crear una base de datos. Un intento de establecer una conexión con la base de datos hará que se cree el archivo de la base de datos.
Por lo tanto, el método create_database no funcionará cuando se use SQLiteAdapter. Simplemente puede eliminar esa línea de su código.
Puede echar un vistazo al código fuente de la tarea Rake db: create
Además, el código fuente para el método ''create'' en SQLiteDatabaseTasks. Como puede ver, simplemente llama al método de establecer conexión
Tratando de mover todos mis modelos compartidos a un motor que se puede incluir en cada una de mis aplicaciones micro.
Este motor debería proporcionar una capa modelo para todos nuestros datos heredados, que incluyen:
- Archivos de modelo
- Archivos de esquema
- Migraciones (estamos siguiendo el patrón de Pivotal Labs , este no es el problema)
Los archivos de modelo están siendo parcheados automáticamente, eso está bien.
Los archivos de esquema están siendo parcheados usando el db.rake de Nikolay Strum :
namespace :db do
namespace :schema do
# desc ''Dump additional database schema''
task :dump => [:environment, :load_config] do
filename = "#{Rails.root}/db/foo_schema.rb"
File.open(filename, ''w:utf-8'') do |file|
ActiveRecord::Base.establish_connection("foo_#{Rails.env}")
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
end
end
end
namespace :test do
# desc ''Purge and load foo_test schema''
task :load_schema do
# like db:test:purge
abcs = ActiveRecord::Base.configurations
ActiveRecord::Base.connection.recreate_database(abcs[''foo_test''][''database''], mysql_creation_options(abcs[''foo_test'']))
# like db:test:load_schema
ActiveRecord::Base.establish_connection(''foo_test'')
ActiveRecord::Schema.verbose = false
load("#{Rails.root}/db/foo_schema.rb")
end
end
end
Necesitamos rake db:create
y rake db:schema:load
to work,
Los parches db.rake
solo afectan a db:schema:dump
y db:test:load_schema
(parte de tests_prepare, supongo). Intenté parcharlos en db:schema:load
usando:
namespace :db do
# Helpers
def mysql_creation_options(config)
@charset = ENV[''CHARSET''] || ''utf8''
@collation = ENV[''COLLATION''] || ''utf8_unicode_ci''
{:charset => (config[''charset''] || @charset), :collation => (config[''collation''] || @collation)}
end
def load_schema(schema_name)
abcs = ActiveRecord::Base.configurations
ActiveRecord::Base.connection.recreate_database(abcs[schema_name+''_test''][''database''], mysql_creation_options(abcs[schema_name+''_test'']))
# like db:test:load_schema
ActiveRecord::Base.establish_connection(schema_name+''_test'')
ActiveRecord::Schema.verbose = false
load("#{Rails.root}/db/#{schema_name}_schema.rb")
end
namespace :schema do
# desc ''Dump additional database schema''
task :dump => [:environment, :load_config] do
dump_schema = -> (schema_name) {
filename = "#{Rails.root}/db/#{schema_name}_schema.rb"
File.open(filename, ''w:utf-8'') do |file|
ActiveRecord::Base.establish_connection("#{schema_name}_#{Rails.env}")
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
end
}
dump_schema.call(''kiddom'')
dump_schema.call(''kiddom_warehouse'')
end
# When loading from schema, load these files, too
task :load => [:environment, :load_config] do
load_schema(''kiddom'')
load_schema(''kiddom_warehouse'')
end
end
namespace :test do
# desc ''Purge and load foo_test schema''
task :load_schema do
load_schema(''kiddom'')
load_schema(''kiddom_warehouse'')
end
end
end
Pero esto me da el error NoMethodError: undefined method ''recreate_database'' for #<ActiveRecord::ConnectionAdapters::SQLite3Adapter:0x007feb6bb43558>
. Aparentemente, esto solo funciona en bases de datos tipo Oracle?
¿Cuáles son los comandos de Rails para DROP
subyacente y sql CREATE DATABASE
que estoy intentando afectar para los schema.rb
''s adicionales?