sql >> データベース >  >> RDS >> PostgreSQL

Rails3はPostgresの一意性制約の例外を無視します

    一般に、例外処理は、例外を使用して適切な処理を実行できるエラーに最も近いポイントで行う必要があります。あなたの場合、あなたはあなたのrescueが欲しいでしょう ループ内の例:

    stuff.each do |h|
      begin
        Model.create(h)
      rescue ActiveRecord::RecordNotUnique => e
        next if(e.message =~ /unique.*constraint.*INDEX_NAME_GOES_HERE/)
        raise
      end
    end
    

    いくつかの興味深い点:

    1. データベース内の制約違反により、ActiveRecord::RecordNotUniqueが生成されます 基になるPG::Errorではなくエラー 。 AFAIK、PG::Errorが表示されます ActiveRecordを経由せずに、データベースと直接通信している場合。
    2. INDEX_NAME_GOES_HEREを置き換えます 一意のインデックスの本名を使用します。
    3. 予期している特定の制約違反のみを無視したいので、next if(...) ビットの後に引数のないraise (つまり、期待どおりでない場合は例外を再発生させます)。


    1. SQL ServerのPAGEIOLATCH_SH待機タイプとは何ですか?

    2. VB.netでSQLの文字列をエンコードする方法

    3. SQLAlchemy Core CREATE TEMPORARY TABLE AS

    4. postgresでの動的SQLクエリ