我正在使用 Jeremy Evan 的Sequel来使用从网页中抓取的数据填充(SQLite)数据库。该数据库涉及我用Associations表达的许多 many_to_many 关系。关联是在类定义中创建的,在脚本运行时总是会对其进行评估。重要的是,关联类定义需要有必要的表。因此,表创建方法应该在关联定义的顶层。这是一个例子:
module Thing
db = Sequel.Sqlite('data.sqlite')
db.create_table(:clients)
String :client_id, :primary_key => true
String :client_data
end
db.create_table(:orders)
String :order_id, :primary_key => true
String :order_data
end
db.create_table(:orders_clients)
String :order_id
String :client_id
primary_key [:order_id,:client_id]
end
class Person < Sequel::Model
unrestrict_primary_key
many_to_many :orders
end
class Order < Sequel::Model
unrestrict_primary_key
many_to_many :orders
end
end
首先,我认为这是一个相当肮脏的解决方案,因为我的方法调用和类定义位于同一个命名空间中。如果我尝试分离类定义,我会得到No database associated with Sequel::Model
错误(这是有道理的,但我想推迟对关联定义的评估,在表调用之后,只要它们可能发生)。
我希望能够在方法调用中创建表和关联。因此,例如,我可以传递新数据库文件的名称:
def create_tables_and_schema (database_name)
db = Sequel.Sqlite(database_name)
db.create_table... #three of those, as above
class Person < Sequel::Model
unrestrict_primary_key
many_to_many :orders
end
class Order < Sequel::Model
unrestrict_primary_key
many_to_many :orders
end
end
我认为需要的是一种不同的方式来表达表关系。
任何关于方法和风格的建议都值得赞赏。如果解释令人困惑,请要求澄清。