#ENCODING: cp1250 =begin rdoc Testcode data mapper See * http://datamapper.org/getting-started * http://datamapper.org/docs/ =end require 'rake' require 'dm-core' #~ END{ DB.disconnect } #======connect=========== desc 'Connect to database' task :connect => :connect_sqlite #======connect_sqlite=========== task :connect_sqlite do #Without filename -> DB in memory DB = DataMapper.setup(:default, 'sqlite::memory:') end #connect #======connect_odbc=========== task :connect_odbc do #dsn, username and password must be known. # #??? # =begin Bisher erfolglos. Siehe http://forum.ruby-portal.de/viewtopic.php?f=22&t=11545 =end end #task connect_odbc #======disconnect=========== task :disconnect do nil =begin Scheint es nicht zu geben: * http://www.mail-archive.com/datamapper@googlegroups.com/msg02894.html * http://tuts9.com/questions/25524/how-to-disconnect-datamappers-repository-database =end end #task disconnect #======create_model=========== task :create_model => :connect do class Film include DataMapper::Resource property :id, Serial property :title, String property :year, Integer end =begin #Model Film verweist auf Tabelle films. =end end #task create_model #======create_tables=========== task :create_tables => :connect do require 'dm-migrations' class Film include DataMapper::Resource property :id, Serial property :title, String property :year, Integer end DataMapper.auto_migrate! =begin *auto_migrate! passt die DB den Models an. *Übliche Ablauf über //rake db:automigrate// =end end #task create_tables #======fill_db=========== desc 'DB mit Testwerten füllen' task :fill_db => [:create_tables, :create_model] do YAML.load(File.read('filmdaten.yaml')).each{|film| Film.create( :title => film['title'], :year => film['year'] ) } =begin =end end #task fill_db #======insert_values=========== task :insert_values => [:create_tables, :create_model] do Film.create(:title => 'Three Ages', :year => 1923) Film.new( :title => 'Steamboat Bill Jr.', :year => 1928 ).save =begin =end end #task insert_values #======select2array=========== task :select2array => :fill_db do res = Film.all() puts res.inspect[0,45] =begin =end end #task select2array #======select2block=========== task :select2block => :fill_db do Film.each{|film| film } Film.select{|film| p film } =begin =end end #task select2block #======select_where=========== task :select_where => :fill_db do res = Film.all(:year => 1923 ) #equal =begin =end res.each{|f| p f } end #task select_where #======select_where_gt=========== task :select_where_gt => [:create_model, :fill_db] do Film.all(:year.gt => 1927 ).each{|f| p f } =begin *Symbole bekommen zusätzliche Methoden, die Selection //größer als// ... ermöglichen. =end end #task select_where_gt #======select_where_in=========== task :select_where_in => [:create_model, :fill_db] do Film.all(:year => [ 1920, 1923 ] ).each{|film| p film } =begin =end end #task select_where_in #======select_where_range=========== task :select_where_range => [:create_model, :fill_db] do Film.all(:year => 1920..1923 ).each{|film| p film } =begin =end end #task select_where_range #======select_col=========== task :select_col => [:create_model, :fill_db] do #Nicht wirklich die Lösung class Film include DataMapper::Resource property :id, Serial property :title, String property :year, Integer, :lazy => true end res = Film.all =begin Nicht wirklich die Lösung. Alternative 'lazy': *Bei der Definition des Models, kann mit der lazy-option angegeben werden, ob eine Spalte gelesen wird. *'lazy'-Spalten werden nur bei Bedarf gelesen. * Siehe http://datamapper.org/articles/spotlight_on_laziness.html =end res.each{|f| p f} end #task select_col #======update=========== task :update => [:create_model, :fill_db] do #~ Film.update(:year => 0 ) Film.all(:year => 1923 ).update(:year => 0 ) =begin =end end #task update #======create_view=========== task :create_view => [:create_tables, :fill_db] do nil =begin *Ansatzpunkte: **Migration **Raw sql mit execute =end end #task create_view #======check_schema=========== desc 'Tabellenbeschreibung erhalten' task :check_schema => [:create_tables, :create_model] do Film.properties.each{|prop| p prop } =begin =end end #task check_schema #======check_schema_columns=========== desc 'Spalten einer Tabelle erhalten' task :check_schema_columns => [:create_tables, :create_model] do p Film.properties.map{|prop| prop.name} =begin *Film.key liefert alle Schlüsselfelder. =end end #task check_schema #======use_sql=========== task :use_sql => :fill_db do =begin Warum man es nicht nutzen sollte: * http://www.mail-archive.com/datamapper@googlegroups.com/msg00762.html =end end #task use_sql #======use_sql_select=========== task :use_sql_select => :fill_db do p DB.select( "select title from films where year = '1923'" ) =begin =end end #task use_sql_select #~ #======use_sql_inverse=========== #~ task :use_sql_inverse => :fill_db do #~ =begin #~ =end #~ end #task use_sql_inverse # ================= #~ task :default => :connect #~ task :default => :connect_sqlite #~ task :default => :connect_odbc #~ task :default => :disconnect #~ task :default => :create_model #~ task :default => :create_tables #~ task :default => :fill_db #~ task :default => :insert_values #~ task :default => :select2array #~ task :default => :select2block #~ task :default => :select_where #~ task :default => :select_where_gt #~ task :default => :select_where_in #~ task :default => :select_where_range #~ task :default => :select_col #~ task :default => :update #~ task :default => :no_model_insert #~ task :default => :no_model_select2array #~ task :default => :no_model_select2block #~ task :default => :no_model_select_where #~ task :default => :no_model_select_col #~ task :default => :no_model_update #~ task :default => :create_view #~ task :default => :check_schema task :default => :check_schema_columns #~ task :default => :use_sql #~ task :default => :use_sql_select #~ task :default => :use_sql_inverse #~ task :default => :disconnect if $0 == __FILE__ Rake.application[:default].invoke end __END__