gpt4 book ai didi

ruby-on-rails - 覆盖 Rails 4 和 SQLite 中的主键列

转载 作者:行者123 更新时间:2023-12-03 01:16:34 25 4
gpt4 key购买 nike

谷歌搜索后,我仍然无法找到在使用 SQLite 时覆盖 Rails 添加的主键的成功方法。到目前为止,我有以下基本迁移:

class CreateRequests < ActiveRecord::Migration
def change
create_table :requests, id: false do |t|
t.string :id
t.string :name
end
end
end

上面的代码告诉Rails不要添加默认的id主键。相反,我想使用字符串类型的id

问题是由于 SQLite 的 ALTER 命令的限制而产生的,该命令无法在创建表后添加主键。因此,我尝试了这个解决方法:

class CreateRequests < ActiveRecord::Migration
def change
create_table :requests, id: false do |t|
t.string :id
t.string :name
end

adapter_type = connection.adapter_name.downcase.to_sym
case adapter_type
when :postgresql
# TODO
when :sqlite
execute <<-SQL
DROP TABLE requests;
CREATE TABLE requests (id TEXT NOT NULL PRIMARY KEY, name TEXT);
SQL
else
raise NotImplementedError, "Unknown adapter type '#{adapter_type}'"
end

end
end

运行rake db:migrate后,我得到以下输出:

== 20140722082104 CreateRequests: migrating ===================================
-- create_table(:requests, {:id=>false})
-> 0.0010s
-- execute(" DROP TABLE requests;\n CREATE TABLE requests (id
TEXT NOT NULL PRIMARY KEY, name TEXT);\n")
-> 0.0010s
== 20140722082104 CreateRequests: migrated (0.0030s) ==========================

所以,看起来一切都很顺利,但是当我使用 SQLite 管理程序检查数据库文件时,表 requests 不存在。

我做错了什么?谢谢。

最佳答案

好的,我已经为自己找到了解决方案:独立执行每个 SQL 语句:

execute "DROP TABLE requests;"
execute "CREATE TABLE requests (id TEXT NOT NULL PRIMARY KEY, name TEXT);"

编辑

一种更优雅的解决方案,可以防止手动创建表,特别是当表有很多列并且我们希望使其与 ActiveRecord 的 create_table 方法的调用保持同步时:

#Get from SQLite's master table the SQL statement that creates the table, 
#and that was initially generated by Rails
sql = select_value("SELECT sql FROM sqlite_master WHERE type='table' AND name='requests'")

#Only replace the definition of the 'id' column by adding the PRIMARY KEY
#constraint
sql.gsub!(/"id" [^,]+/, '"id" VARCHAR(255) NOT NULL PRIMARY KEY')

#Delete the original table
drop_table :requests

#Create the table again
execute sql

关于ruby-on-rails - 覆盖 Rails 4 和 SQLite 中的主键列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24884401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com