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

ID生成にPostgreSQLSERIALを使用するようにSQLAlchemyを設定します

    PRIMARY KEY SEQUENCEを使用するように定義する必要があります DEFAULTとして 、SERIAL経由のいずれか 便利な疑似タイプ:

    CREATE TABLE blah (
        id serial primary key,
        ...
    );
    

    または明示的なSEQUENCE

    CREATE SEQUENCE blah_id_seq;
    
    CREATE TABLE blah (
        id integer primary key default nextval('blah_id_seq'),
        ...
    );
    
    ALTER SEQUENCE blah_id_seq OWNED BY blah.id;
    

    これは、SQLAlchemyのドキュメントで説明されています です。 。

    これを既存のテーブルに追加できます:

    CREATE SEQUENCE blah_id_seq OWNED BY blah.id;
    
    ALTER TABLE blah ALTER COLUMN id SET DEFAULT nextval('blah_id_seq');
    

    ダンプを復元したい場合は、シーケンスを手動で追加してください。

    COPYを使用してテーブルに直接ロードした既存のデータがある場合 または同様に、シーケンスの開始点を設定する必要があります:

    SELECT setval('blah_id_seq', max(id)+1) FROM blah;
    

    問題は、SQLiteで開発し、ダンプを実行して、そのダンプをPostgreSQLに復元することに関係している可能性が高いと思います。 SQLAlchemyは、適切なデフォルトとシーケンスを使用してスキーマを独自に作成することを期待しています。

    代わりに、SQLAlchemyに新しい空のデータベースを作成させることをお勧めします。各テーブルのデータをSQLiteDBからCSVにダンプしてから、COPY そのデータをPostgreSQLテーブルに入れます。最後に、setvalでシーケンスを更新します したがって、適切な値を生成します。

    いずれにせよ、あなたは必要 適切なシーケンスが作成されていることを確認します。あなたはSERIALによってそれをすることができます 疑似列タイプ、または手動のSEQUENCE 作成とDEFAULT 設定しますが、あなたはそれをしなければなりません。そうでなければ、生成されたIDを効率的で並行性に安全な方法でテーブルに割り当てる方法はありません。



    1. mysql2つの列を使用していない場合

    2. 多対多のテーブルがピボットで結合します

    3. mysqlテーブルをsparkデータセットに変換することは、csvファイルからのものと比較して非常に遅いです

    4. C# で SQL 定義関数を呼び出す