質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.98%

Ruby Sequelでのテーブルを作る際のエラー

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 753

Nozo

score 2

ご教授よろしくお願いします

前提・実現したいこと

Yahooの形態素解析APIを叩いて、帰ってきた値をSqlite3にいれるスクリプトを書いています。
使用言語はRubyです

発生している問題・エラーメッセージ

keitaiso.sqlite3ファイルを作る前はエラー吐かないのですが、ファイルを作るとエラーを吐きます

bundle exec ruby yahoo_db.rb
/Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:108:in `step': SQLite3::ConstraintException: UNIQUE constr
aint failed: adjective.surface, adjective.reading (Sequel::UniqueConstraintViolation)
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:108:in `block in each'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:107:in `loop'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/lib/sqlite3/statement.rb:107:in `each'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:156:in `to_a'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:156:in `block in execute'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:95:in `prepare'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sqlite3-1.3.13/lib/sqlite3/database.rb:137:in `execute'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sequel-4.48.0/lib/sequel/adapters/sqlite.rb:197:in `block (2 levels) in _execute'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sequel-4.48.0/lib/sequel/database/logging.rb:45:in `log_connection_yield'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sequel-4.48.0/lib/sequel/adapters/sqlite.rb:197:in `block in _execute'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sequel-4.48.0/lib/sequel/database/connecting.rb:301:in `block in synchronize'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sequel-4.48.0/lib/sequel/connection_pool/threaded.rb:107:in `hold'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sequel-4.48.0/lib/sequel/database/connecting.rb:301:in `synchronize'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sequel-4.48.0/lib/sequel/adapters/sqlite.rb:188:in `_execute'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sequel-4.48.0/lib/sequel/adapters/sqlite.rb:154:in `execute_insert'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sequel-4.48.0/lib/sequel/dataset/actions.rb:1097:in `execute_insert'
        from /Users/nozomi/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/sequel-4.48.0/lib/sequel/dataset/actions.rb:402:in `insert'
        from yahoo_db.rb:114:in `input_db'
        from yahoo_db.rb:142:in `<main>'

該当のソースコード

require "sequel"
require "sqlite3"
DB = Sequel.sqlite('keitaiso.sqlite3')
class Keitaiso
  def initialize
    # 形容詞
    DB.create_table? :adjective do
        primary_key :id
        String :surface
        String :reading
        unique [:surface, :reading]
    end
    # 形容動詞
    DB.create_table? :adjective_verb do
        primary_key :id
        String :surface
        String :reading
        unique [:surface, :reading]
    end
    # 感嘆詞
    DB.create_table? :exclamations do
        primary_key :id
        String :surface
        String :reading
        unique [:surface, :reading]
    end
    # 副詞
    DB.create_table? :adverb do
        primary_key :id
        String :surface
        String :reading
        unique [:surface, :reading]
    end
    # 連体詞
    DB.create_table? :subjective do
        primary_key :id
        String :surface
        String :reading
        unique [:surface, :reading]
    end

    # 接続詞
    DB.create_table? :conjunction do
        primary_key :id
        String :surface
        String :reading
        unique [:surface, :reading]
    end

    # 接頭辞
    DB.create_table? :prefix do
        primary_key :id
        String :surface
        String :reading
        unique [:surface, :reading]
    end

    # 接尾辞
    DB.create_table? :suffix do
        primary_key :id
        String :surface
        String :reading
        unique [:surface, :reading]
    end

    # 名詞
    DB.create_table? :nouns do
        primary_key :id
        String :surface
        String :reading
        unique [:surface, :reading]
    end

    # 動詞
    DB.create_table? :verb do
        primary_key :id
        String :surface
        String :reading
        unique [:surface, :reading]
    end

    # 助詞
    DB.create_table? :particle do
        primary_key :id
        String :surface
        String :reading
        unique [:surface, :reading]
    end

    # 助動詞
    DB.create_table? :auxiliary_verb do
        primary_key :id
        String :surface
        String :reading
        unique [:surface, :reading]
    end

    @adjective = DB[:adjective]
    @adjective_verb = DB[:adjective_verb]
    @exclamations = DB[:exclamations]
    @adverb = DB[:adverb]
    @subjective = DB[:subjective]
    @conjunction = DB[:conjunction]
    @prefix = DB[:prefix]
    @suffix = DB[:suffix]
    @nouns = DB[:nouns]
    @verb = DB[:verb]
    @particle = DB[:particle]
    @auxiliary_verb = DB[:auxiliary_verb]
  end
  def input_db(t)
    case t[0]
    when "形容詞"
      @adjective.insert(:surface => t[1], :reading => t[2])
    when "形容動詞"
      @adjective_verb.insert(:surface => t[1], :reading => t[2])
    when "感動詞"
      @exclamations.insert(:surface => t[1], :reading => t[2])
    when "副詞"
      @adverb.insert(:surface => t[1], :reading => t[2])
    when "連体詞"
      @subjective.insert(:surface => t[1], :reading => t[2])
    when "接続詞"
      @conjunction.insert(:surface => t[1], :reading => t[2])
    when "接頭辞"
      @prefix.insert(:surface => t[1], :reading => t[2])
    when "接尾辞"
      @suffix.insert(:surface => t[1], :reading => t[2])
    when "名詞"
      @nouns.insert(:surface => t[1], :reading => t[2])
    when "動詞"
      @verb.insert(:surface => t[1], :reading => t[2])
    when "助詞"
      @particle.insert(:surface => t[1], :reading => t[2])
    when "助動詞"
      @auxiliary_verb.insert(:surface => t[1], :reading => t[2])
    end
  end
end

keitaiso = Keitaiso.new()
keitaiso.input_db(["形容詞", "可愛い", "かわいい"])

試したこと

DB.create_table? :adjective do
        primary_key :id
        String :surface
        String :reading
        unique [:surface, :reading]
end


の部分でエラーを吐かれていることは確認しました。
ただ、

補足情報(言語/FW/ツール等のバージョンなど)

ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]

Gemfile

#frozen_string_literal: true
source "https://rubygems.org"

gem "twitter"
gem "sequel"
gem "sqlite3"

よろしくお願いします

 追記

REPL 出た目したところ
同じ値をSqlite3に代入しようとしたところ、UNIQUEなためエラーが履かれています
今回やりたいのは:surface :reading両方がUNIQUEのときのものを排除したいのですが、よいやりかたはありませんか

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

例外処理を書くことで解決しました

以下変更後のコードです

def input_db(t)
    begin
      case t[0]
      when "形容詞"
        @adjective.insert(:surface => t[1], :reading => t[2])
      when "形容動詞"
        @adjective_verb.insert(:surface => t[1], :reading => t[2])
      when "感動詞"
        @exclamations.insert(:surface => t[1], :reading => t[2])
      when "副詞"
        @adverb.insert(:surface => t[1], :reading => t[2])
      when "連体詞"
        @subjective.insert(:surface => t[1], :reading => t[2])
      when "接続詞"
        @conjunction.insert(:surface => t[1], :reading => t[2])
      when "接頭辞"
        @prefix.insert(:surface => t[1], :reading => t[2])
      when "接尾辞"
        @suffix.insert(:surface => t[1], :reading => t[2])
      when "名詞"
        @nouns.insert(:surface => t[1], :reading => t[2])
      when "動詞"
        @verb.insert(:surface => t[1], :reading => t[2])
      when "助詞"
        @particle.insert(:surface => t[1], :reading => t[2])
      when "助動詞"
        @auxiliary_verb.insert(:surface => t[1], :reading => t[2])
      end
    rescue Sequel::UniqueConstraintViolation => e
    end
  end

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる