如何让DataMapper不指定NULL默认值

时间:2014-11-09 19:22:29

标签: ruby sqlite sinatra datamapper

当我使用DataMapper的auto_upgrade!方法根据我的代码中定义的属性在SQLite3数据库中添加字段时,我收到错误:

  

/ history的DataObjects :: SyntaxError   无法使用默认值NULL

添加NOT NULL列

违规行的一个例子是:

property :fieldname, Text,  required: true

如果我(a)删除该行,(b)删除required: true,(c)将true更改为false,或(d)添加默认值,则错误消失

SQLite 需要为每个字段指定默认值,所以这个问题肯定是DataMapper,而不是SQLite。

我如何解决这个问题,因此DataMapper可以指定需要一个字段而不假设不自动指定默认值意味着默认值应为NULL?

(如果你想更多地了解我为什么设计这种方式:将有另一个客户端进程访问SQLite并将数据记录到SQLite数据库中,而Sinatra应用程序将从数据库中提取数据因此我希望数据库强制执行字段要求,但是DM的auto_upgrade是一种非常方便的方法,可以根据需要升级数据库 - 只要它不会导致数据泄露在这个过程中。)

2 个答案:

答案 0 :(得分:0)

您需要该字段,因此它不能为NULL。这是简单的表属性。

当DataMapper运行auto_upgrade时!它在数据库上运行SQL命令。

CREATE TABLE Test
(
  P_Id int NOT NULL,
  lname varchar(255) NOT NULL,
  fname varchar(255),
  Address varchar(255),
  City varchar(255)
)

做这样的事情是行不通的。

CREATE TABLE Test
(
  P_Id int NOT NULL,
  lname varchar(255) NOT NULL DEFAULT NULL,
  fname varchar(255),
  Address varchar(255),
  City varchar(255)
)

我在MySQL中测试了它,这是错误。

  

02:52:43 CREATE TABLE TestTest(P_Id int NOT NULL,lname   varchar(255)NOT NULL DEFAULT NULL,fname varchar(255),Address   varchar(255),City varchar(255))错误代码:1067。默认值无效   'lname'的值为0.062秒

更正:SQLite允许您创建具有此类属性的表。但是,当尝试向该表插入任何内容时,无论该字段是否为NULL,都会引发错误。因此,即使创建表格,DataMapper也可能会为您做一些卫生设施。

答案 1 :(得分:0)

我不清楚您是在创建新表还是修改现有表。

如果您有一个现有的表并且正在尝试使用定义为NOT NULL的列来更改它,那么必须提供默认值,以便可以迁移现有的行。 RDBMS需要知道在预先存在的行的字段中放置什么。

如果要创建新表,那么您拥有的属性定义应该没问题。