2010-10-17 11 views
0

Ce code échoue sur la dernière ligne en raison de la vérification de table_exists? Comment est-ce que je fais correctement ceci dans Datamapper?Comment savoir si une table existe dans DataMapper


require 'sinatra' 
require 'DataMapper' 

DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/blog.db") 

class Post 
    include DataMapper::Resource 
    property :id, Serial 
    property :title, String 
    property :body, Text 
    property :created_at, DateTime 
end 

DataMapper.finalize 

# automatically create the post table 
DataMapper.auto_migrate! unless Post.table_exists? 

Répondre

5

Justin,

Si vous avez dm-migrations nécessaire (ce qui signifie essentiellement que vous utilisez un adaptateur SGBDR de toute façon), vous pouvez faire ce qui suit pour savoir si une table (ou d'une colonne à l'intérieur de cette table) existe.

# Find out if the table named 'people' exists 
DataMapper.repository(:default).adapter.storage_exists?('people') 

# Find out if there's a 'name' column in the 'people' table 
DataMapper.repository(:default).adapter.field_exists?('people', 'name') 

Notez que ces méthodes de l'API se ne mélangées dans le adapter si dm-migrations sont nécessaires et que vous utilisez un DataObjectsAdapter descendant.

1

Vous pouvez utiliser DataMapper.auto_update! qui devrait être non destructive (ajoute tables/colonnes seulement).

+0

ouais merci, c'est ce que j'ai fait pour contourner le problème, mais je voudrais vraiment comprendre ce qui est arrivé à foo.table_exists? –