我正在尝试学习rails,但遇到了一些问题。
我有一个旧的 sqlite3 数据库,它有一个Accounts
我之前用一些 GUI 程序制作的表。我想看看是否可以通过数据库迁移重新创建该表。
这是我之前的描述(我的目标):
-- desired
CREATE TABLE "accounts" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL DEFAULT (0),
"username" TEXT NOT NULL COLLATE NOCASE,
"password_hash" BLOB NOT NULL,
"creation_time" INTEGER NOT NULL DEFAULT(strftime('%s', 'now')),
"expiration_time" INTEGER NOT NULL DEFAULT(strftime('%s', 'now') + 2592000)
)
我当前的迁移代码将无法正常工作。我在某个地方读到了可以:options
用来指定 ActiveRecord 无法封装的东西的地方,但我可能做错了。当我使用:default => Time.now.to_i
时,它只是硬编码了一些默认值;当我使用时:default => "strftime('%s', 'now')"
,它根本不起作用。
class CreateAccounts < ActiveRecord::Migration
def change
create_table :accounts do |t|
t.column 'username', :text, :null => false, :options => 'COLLATE NOCASE'
t.column 'password_hash', :binary, :null => false
t.column 'creation_time', :integer, :null => false, :options => "DEFAULT(strftime('%s', 'now'))"
t.column 'expiration_time', :integer, :null => false, :options => "DEFAULT(strftime('%s', 'now') + 2592000)"
end
end
end
我最终得到下表。看起来所有的:option
值都被忽略了。
-- what i actually get
CREATE TABLE "accounts" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"username" text NOT NULL,
"password_hash" blob NOT NULL,
"creation_time" integer NOT NULL,
"expiration_time" integer NOT NULL
)
创建列时如何指定 SQL 位?任何帮助将不胜感激。