`
fireflyman
  • 浏览: 113296 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

在ROR中創建關聯表失敗了(數據庫用的是sqlite3)

阅读更多

(沒有積分,因此沒辦法在問答頻道問問題.路過的,幫忙解答下)

我首先用的是

引用
script/generate migration create_books_and_authors



  然后在編輯器中打開了對應的rb文件,代碼如下:

class CreateBooksAndAuthorsBooks  255, :null=> false

      table.column :publisher_id, :integer, :null=> false

      table.column :published_at, :datetime

      table.column :isbn, :string, :limit=>13, :unique=> true

      table.column :blurb, :text

      table.column :page_count, :integer

      table.column :price, :float

      table.column :created_at, :timestamp

      table.column :updated_at, :timestamp

    end

    create_table :authors_books, :id => false do |table|

      table.column :author_id, :integer, :null=> false

      table.column :book_id, :integer, :null=> false

    end

   

    say_with_time  'Adding foreign keys'  do

     

      execute 'ALTER TABLE authors_books ADD CONSTRAINT fk_bk_authors FOREIGN KEY (author_id) REFERENCES authors(id) ON DELETE CASCADE'

     

      execute 'ALTER TABLE authors_books ADD CONSTRAINT fk_bk_books FOREIGN KEY (book_id) REFERENCES books(id) ON DELETE CASCADE'

     

      execute 'ALTER TABLE books ADD CONSTRAINT fk_books_publishers FOREIGN KEY (publisher_id) REFERENCES publishers(id) ON DELETE CASCADE'

  end

end

    

   

  def self.down

    drop_table :authors_books

    drop_table :books

  end

end






然后執行

引用
rake db:migrate


引用
== 3 CreateBooksAndAuthorsBooks: migrating ====================================

-- create_table(:books)

rake aborted!

SQLite3::SQLException: table books already exists: CREATE TABLE books ("id" INTE

GER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar(255) NOT NULL, "publishe

r_id" integer NOT NULL, "published_at" datetime DEFAULT NULL, "isbn" varchar(13)

DEFAULT NULL, "blurb" text DEFAULT NULL, "page_count" integer DEFAULT NULL, "pr

ice" float DEFAULT NULL, "created_at" datetime DEFAULT NULL, "updated_at" dateti

me DEFAULT NULL)



卻發現只創建了books表,而authors_books表并未創建.

請問是否是代碼錯了,或者是其它什么原因呢?

 

分享到:
评论
4 楼 fireflyman 2009-08-17  
问题终于解决了,Sqlite3是不允许使用外键的,另外在应用的时候,可以参考
http://www.iteye.com/topic/450384
Rails每周一题(十八): Association之魔法

中的下面代码,解决关联表问题:


class Teacher
  has_many :relations
  has_many :students, :through => :relations
end

class Relation
  belongs_to :teacher
  belongs_to :student
end

class Student
  has_many :relations
  has_many :teachers, :through => :relations
end


改写成我的需要,就变成


    class book   
     has_and_belongs_to_many :authors_books   
      has_and_belongs_to_many :author, :through => :authors_books   
      
    end   
      
    class authors_books   
      belongs_to :books   
     belongs_to :authors   
   end   
     
   class author  
     has_and_belongs_to_many: authors_books   
    has_and_belongs_to_many :books, :through => :authors_books   
   end  
3 楼 fireflyman 2009-08-13  
引用
== 3 CreateBooksAndAuthorsBooks: migrating ====================================
-- create_table(:books)
   -> 0.1250s
-- create_table(:authors_books, {:id=>false})
   -> 0.0940s
-- Adding foreign keys
-- execute("ALTER TABLE authors_books ADD CONSTRAINT fk_bk_authors FOREIGN KEY (
author_id) REFERENCES authors(id) ON DELETE CASCADE")
rake aborted!
SQLite3::SQLException: near "CONSTRAINT": syntax error: ALTER TABLE authors_book
s ADD CONSTRAINT fk_bk_authors FOREIGN KEY (author_id) REFERENCES authors(id) ON
DELETE CASCADE

新出錯信息
2 楼 fireflyman 2009-08-13  
数据库命名规范

1 目的

规范数据库各种对象的命名规则。

2 数据库命名原则

2.1 数据文件

如果数据库采用文件系统,而不是裸设备,约定下列命名规则:

1)数据文件以表空间名为开始,以.dbf为结尾,全部采用小写英文字母加数字命名。如该表空间有多个数据文件,则从第2个数据文件开始,在表空间名后加_。

例:对system表空间的数据文件:system.dbf,system_2.dbf

2)对oracle数据库的控制文件,用control.ctl来表示。如control01.ctl,control02.ctl。

3)对oracle数据库的日志文件,在线日志文件用redo<组名><文件序列名>.dbf 来表示。其中组名和文件序列名均用2位数字来表示。如第一组的两个文件表示位redo0101.dbf和redo0102.dbf。归档日志用arch_ %t_%s.arc来表示。其中%t和%s均为oracle约定的变量。

2.2 表空间

2.2.1 数据库系统表空间

数据库系统表空间包括system表空间,临时表空间,回滚段的表空间。约定下列命名规则:

1)system表空间由数据库直接限定,不能进行修改。

2)临时表空间用temp来表示。如果有多个临时表空间,从第2个临时表空间开始,在temp后面加来表示。

3)回滚段表空间用undotbs来表示。如果有多个回滚段表空间,从第2个回滚段表空间开始,在undotbs后面加来表示。

2.2.2 数据库的用户表空间

数据库的用户表空间用ts_<表空间名>来表示。其中,表空间名分为:

1)数据空间:对于用户的缺省表空间,用default来表示。对于其他的表空间,根据存放在表空间上的表的类别来表示。如放代码的表,用code来表示。放客户资料的表,用customer来表示。尽量用一个表空间来存放该类的表。如果某表特别大,可考虑单独使用一个表空间。

2)索引空间:在相应的数据表空间的名字前加ind_。如对用户缺省表空间的索引空间,用ts_ind_default来表示。对代码表的索引表空间,用ts_ind_code来表示。

2.3 表

数据库表的命名采用如下规则:

1)表名用T_开头,表名长度不能超过30个字符,表名中含有单词全部采用单数形式,单词要大写。

引用
2)多个单词间用下划线(_)进行连接。若库中有多个系统,表名采用系统名称+单词或多个单词,系统名是开发系统的缩写,如VNET。

3)表中含有的单词建议用完整的单词。如果导致表名长度超过30个字符,则从最后一个单词开始,依次向前采用该单词的缩写。(如果没有约定的缩写,则采用该单词前4个字母来表示)。

数据库表的字段命名采用如下规则:

1)数据库字段名全部采用小写英文单词,单词之间用”_”隔开。字段长度不能超过30个字符。

2)如果该字段是代码,则在单词后加_id。

3)如果该字段表示的是时间,则使用_time为后缀。

2.4 视图

数据库视图的命名采用如下规则:

1)视图名用V_开头,视图名长度不能超过30个字符。视图名用大写的英文单词来表示。

2)视图由几个表产生就用下划线(_)连接几个表的名,如果表过多可以将表名适当简化,但一定要列出所有表名。

2.5 序列

数据库序列的命名采用如下规则:

序列名用seq_开头,后面跟使用该序列的字段名。如果有几个字段用同一个序列,用下划线(_)连接几个字段的名称。如果不同表中相同的字段名需要使用不同的序列,则在字段名后加表的特征,用下划线(_)连接。序列名长度不能超过30个字符。序列名用小写的英文单词来表示。

2.6 存储过程

存储过程的命名采用如下规则:

存储过程名用Pr_开头,存储过程名长度不能超过30个字符。存储过程名用小写的英文单词来表示。

2.7 函数

函数的命名采用如下规则:

函数名用Fu_开头,函数名长度不能超过30个字符。函数名用小写的英文单词来表示。

2.8 触发器

触发器的命名采用如下规则:

触发器名用Tr_开头,触发器名长度不能超过30个字符。触发器名用小写的英文单词来表示。

2.9 主键

主键的命名采用如下规则:

主键名用pk_开头,后面跟该主键所在的表名。主键名长度不能超过30个字符。如果过长,可对表名进行缩写。缩写规则同表名的缩写规则。主键名用小写的英文单词来表示。

2.10 外键

引用
外键的命名采用如下规则:

外键名用fk_开头,后面跟该外键所在的表名和对应的主表名(不含t_)。子表名和父表名自己用下划线(_)分隔。外键名长度不能超过30个字符。如果过长,可对表名进行缩写。缩写规则同表名的缩写规则。外键名用小写的英文单词来表示。

2.11 索引

索引的命名采用如下规则:

1)索引名用小写的英文字母和数字表示。索引名的长度不能超过30个字符。

2)主键对应的索引和主键同名。

3)每类索引都用_结束。

4)唯一性索引用uni_开头,后面跟表名。一般性索引用ind_开头,后面跟表名。

5)如果索引长度过长,可对表名进行缩写。缩写规则同表名的缩写规则。
1 楼 fireflyman 2009-08-13  
感謝ysorign的幫助,問題已經解決了.把books表刪除,然后再執行一遍就行了.

发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics