`
fireflyman
  • 浏览: 118314 次
  • 性别: 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表刪除,然后再執行一遍就行了.

发表评论

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

相关推荐

    ruby on rails

    4. **SQLite3或PostgreSQL/MySQL数据库**: Rails默认使用SQLite3,但在生产环境中,通常选择PostgreSQL或MySQL。 5. **Node.js**: 用于处理JavaScript和CSS资产的编译。 6. **Yarn**: JavaScript包管理器,用于...

    ruby on rails 实例1

    6. **数据库和迁移**:RoR通常与SQLite、MySQL或PostgreSQL等数据库配合使用,`db:migrate`命令执行数据库迁移,用于更新数据库结构。 7. **RESTful设计**:RoR鼓励使用REST(Representational State Transfer)...

    sample-ror-app:Ruby on Rails 教程

    在RoR中,我们通常使用ActiveRecord,它是Ruby的一个库,将数据库操作与对象关联起来,使得数据操作更加便捷。 2. **视图(View)**:视图负责呈现用户界面,它与模型交互,获取并展示数据。RoR使用ERB(Embedded ...

    毕业设计-通用web信息采集系统RubyonRails

    4. **ActiveRecord**: RoR中的ORM(对象关系映射)库,将数据库操作与Ruby对象关联,简化了数据库操作。 5. **路由(Routing)**: Rails的路由系统将URL映射到控制器的特定动作上,实现URL到业务逻辑的转换。 6. *...

    learn-rails:用于学习 RoR 的 Learn-rails 应用程序

    在教程中,你可能会使用SQLite,因为它简单易用且不需要额外安装。 路由是Rails应用的“神经系统”,定义了URL到控制器动作的映射。`config/routes.rb`文件是配置路由的地方。在这里,你可以定义资源、命名路由以及...

    sample_app:Rails教程第3章

    6. **迁移(Migration)**: 在创建模型后,会自动生成迁移文件,用于数据库表的创建和修改。使用`rails db:migrate`执行迁移操作。 7. **控制器(Controller)**: 控制器处理HTTP请求,调用模型并传递数据给视图。...

    Ruby-Tracks是一个采用RubyonRails构建的GTDWeb应用程序

    4. **数据库操作**:使用SQLite或PostgreSQL等数据库,了解ActiveRecord的查询构造和关联。 5. **RESTful设计**:Rails鼓励使用REST(Representational State Transfer)原则来设计API和URL结构。 6. **Gem管理**:...

    ruby_todo:ruby_test

    在Ruby on Rails(RoR)框架中,"ruby_todo:ruby_test"可能是一个关于创建待办事项应用(Todo List)的示例项目,用于教学目的。这个项目可能使用了Ruby编程语言以及Rails的MVC(Model-View-Controller)架构模式来...

    urlShortener:Ruby on Rails 中的基本 URL 缩短网站

    7. **数据库**:RoR默认使用SQLite,但也可以配置为使用其他数据库如MySQL或PostgreSQL。在`db/schema.rb`文件中,可以查看数据库的结构。 8. **ActiveRecord**:RoR的ORM(Object-Relational Mapping)工具,允许...

    pruebablog

    在Ruby社区中,"prueba"是西班牙语中的"测试",所以这可能是一个开发者创建的用于尝试和学习Ruby on Rails(RoR)框架的博客应用。 Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程...

    Windows上的Ruby on Rails正式投入生产

    在Windows平台上将Ruby on Rails(RoR)应用于生产环境可能会比在Unix-like系统上遇到更多的挑战,但并非不可能。这篇文章将引导新手Web程序员和对RoR感兴趣的开发者如何在Windows上搭建并部署一个稳定的生产环境。 ...

    social-window-email-2021-3-7:社会の窓が空いていることを匿名メールで通知サービスを作ってみよう!(techpit)

    这可能需要用到数据库,如SQLite(本地开发)或Heroku推荐的PostgreSQL服务。 10. **邮件服务API**: 可能会使用第三方邮件服务(如SendGrid、Mailgun或AWS SES)的API来发送邮件,这些服务提供了可靠的邮件传递和...

    radiant-0.8.1.zip_Windows编程_Others_

    尽管RoR通常与Unix-like系统如Linux或Mac OS X关联,但通过使用如RubyInstaller这样的工具,开发者也可以在Windows上搭建完整的Ruby和Rails开发环境。 这个压缩包可能包含以下内容: 1. **Gemfile**: 这是Rails...

Global site tag (gtag.js) - Google Analytics