【问题标题】:How to check presence and datatype of database table columns at run time?如何在运行时检查数据库表列的存在和数据类型?
【发布时间】:2012-09-25 13:30:57
【问题描述】:

我正在使用 Ruby on Rails 3.2.2,我想检查数据库表列的存在数据类型(例如:String、@ 987654324@, ...) 给定模型类的该列。也就是说,我在 lib 目录中实现了一个 Ruby 模块,并使用一个将模型类传递给它的方法(例如:Article),我想验证某些相关数据库表列的一些条件,仅此而已。

在我的模块方法中,我尝试使用column_exists? 方法,如下所示

module MyModule
  def check_column(model_class)
    table = model_class.to_s.tableize

    unless ActiveRecord::Base.connection.column_exists?(table.to_sym, :title)
      raise ...
    end
  end
end

但没有成功:与column_exists? 方法相关的(奇怪的)输出错误是这样的

Mysql2::Error: Table '<MY_APP_NAME>_development.<A_TABLE_NAME>/<ANOTHER_TABLE_NAME>/<ANOTHER_TABLE_NAME>' doesn't exist: SHOW FULL FIELDS FROM `<A_TABLE_NAME>/<ANOTHER_TABLE_NAME>/<ANOTHER_TABLE_NAME>`

如何在运行时正确检查数据库表列的存在数据类型

【问题讨论】:

  • 您希望您的数据库在您的应用程序下发生变化吗?数据库应该是静态的,并且它的表、字段和字段类型是通过迁移或因为它是遗留的而预先确定的。为什么不提前知道字段是什么类型?任何 ORM 都必须知道表名、字段名和类型才能正常工作。 ActiveRecord 和 Sequel 在连接后都会检查模式,所以这是询问它们的情况。 Sequel 可以很容易地找到这些东西,所以我相信 ActiveRecord 也可以。但问题仍然存在,为什么需要检查?
  • @the Tin Man - (1) :“你希望你的数据库在你的应用程序下面发生变化吗?”。 :不,我没有。 (2) :“[...]你为什么需要检查?”。 :我在问题中写道:“我想验证某些相关数据库表列的一些条件,仅此而已”。
  • 在您的应用程序启动之前,您应该了解有关数据库的所有信息,因此,即使不查询它,您也知道数据类型、字段宽度、字段名称等。您不需要检查任何内容。如果这样做,则数据验证或系统设计有问题。
  • @the Tin Man - 你是对的,但根据我的需要,当应用程序以开发者模式启动时,会检查数据库表列。

标签: ruby-on-rails ruby database ruby-on-rails-3


【解决方案1】:

您可以使用ActiveRecord::Base.connection 将查询直接发送到 DBM。

您可以要求 DBM 描述一个特定的表,然后解析字段以找出有关数据类型的任何信息。

【讨论】:

  • 你能举例说明如何正确使用ActiveRecord::Base.connection吗?
猜你喜欢
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 2011-07-01
相关资源
最近更新 更多