OneDay

40歳からプログラマとして生活しています。

Rails SQLite3の挙動確認

lp.spartacamp.jp

に参加していて、2/13、2/14で前半戦終了。2/20、2/21で後半戦。今回のキャンプは平日を5日挟むから、復習予習可能。その際、SQLiteで気になったことがあって、その調査。

気になったこと: databaseをSQLiteを指定し、データベース構築時にlimit制約を設定するが、全く機能しない。

class CreateCustomers < ActiveRecord::Migration
  def change
    create_table :customers do |t|
      t.string :name, null: false, limit: 10
      t.string :email, null: false, limit: 10

      t.timestamps null: false
    end
  end
end

`bin/rake db:migrate`後、nameカラムが11文字以上のレコードを追加時にSQLiteに怒られるはずが、怒られない。

rails new mysqltest -d mysql

で、同様の実験。


ActiveRecord::StatementInvalid in CustomersController#create
Mysql2::Error: Data too long for column 'name' at row 1: INSERT INTO `customers` (`name`, `email`, `created_at`, `updated_at`) VALUES ('aaaaaaaaaaaaa', 'aaaaaaaaaaaaa', '2016-02-18 07:16:42', '2016-02-18 07:16:42')


期待通りにエラーが出た。MySQLは、databaseとmodelのvalidationのダブルで安全性高められるが、SQLiteではこうならない。ちょっとSQLite注意。



他の方も記述されていました。
SQLite3でvarchar型に最大文字数制限ないのね - 日々精進いたします

MySQLMacローカルで使用した際に遭遇したエラー対処
[ERROR! The server quit without updating PID file]
HomebrewでMySQLをセットアップしたらちょろりとハマった - light log