2017-11-05 6 views
0

私はdatasetライブラリを使用して、postgresデータベースをsqliteファイルにバックアップしようとしています。次のように私が実行しているコードが行く:エラー:プライマリキーを非プライマリキーとして再定義しようとしています

local_db = "sqlite:///backup_file.db" 

with dataset.connect(local_db) as save_to: 
    with dataset.connect(postgres_db) as download_from: 

     for row in download_from['outlook']: 
      save_to['outlook'].insert(row) 

私はテーブルの1行を印刷する場合、それは次のようになります。私が手save_to['outlook'].insert(row)私はラインに到達したとき、しかし

OrderedDict([ 
    ('id', 4400), 
    ('first_sighting', '2014-08-31'), 
    ('route', None), 
    ('sighted_by', None), 
    ('date', None) 
]) 

次のスタックトレースでエラーが発生しました。

Traceback (most recent call last): 
    File "/home/anton/Development/Python/TTC/backup_db.py", line 25, in <module> 
    save_to['outlook'].insert(dict(row)) 
    File "/home/anton/.virtualenvs/flexity/lib/python3.6/site-packages/dataset/table.py", line 79, in insert 
    row = self._sync_columns(row, ensure, types=types) 
    File "/home/anton/.virtualenvs/flexity/lib/python3.6/site-packages/dataset/table.py", line 278, in _sync_columns 
    self._sync_table(sync_columns) 
    File "/home/anton/.virtualenvs/flexity/lib/python3.6/site-packages/dataset/table.py", line 245, in _sync_table 
    self._table.append_column(column) 
    File "/home/anton/.virtualenvs/flexity/lib/python3.6/site-packages/sqlalchemy/sql/schema.py", line 681, in append_column 
    column._set_parent_with_dispatch(self) 
    File "/home/anton/.virtualenvs/flexity/lib/python3.6/site-packages/sqlalchemy/sql/base.py", line 431, in _set_parent_with_dispatch 
    self._set_parent(parent) 
    File "/home/anton/.virtualenvs/flexity/lib/python3.6/site-packages/sqlalchemy/sql/schema.py", line 1344, in _set_parent 
    self.key, table.fullname)) 
sqlalchemy.exc.ArgumentError: Trying to redefine primary-key column 'id' as a non-primary-key column on table 'outlook' 

私が間違っていることは何ですか?私はこれをPython 2.7.14と3.6.3で試しました

+0

2回目の挿入に失敗しますか? – Dionys

+0

「非主キー」とは何ですか? – wildplasser

答えて

0

私はそれを理解しました!したがって、デフォルトでは、databaseライブラリは、自動的に増分する整数プライマリキーを持つテーブルを作成します。しかし、私のデータはすでに 'id'カラムを持っています。私はそれに行を追加しようとする前に、この問題を回避するために、私は私のテーブルを定義する必要があり、以下のように主キーとそれを定義します。

with dataset.connect(local_db) as save_to: 
    with dataset.connect(postgres_db) as download_from: 

     table_to_save_to = save_to.create_table('outlook', primary_id=False) 

     for row in download_from['outlook']: 
      table_to_save_to.insert(row) 

.create_table(table_name, primary_key=False)を行うことで、私は私は私を挿入できることを確認することができます自分のid値をテーブルに追加します。

私はこの解決策がreading the docsであることを発見しました。

1

"outlook"用に作成されたスキーマとテーブルがあると仮定して、PKフィールドを作成しましたか? sqliteがPKフィールドを作成するフィールドを決定させましたか?

idを2回挿入しようとしていることが強くあります。一度、sqliteはそれ自体を挿入し、他は他のテーブルレコードから来ます。

+0

これは意味があります。私はスキーマを定義していません - それはライブラリによって処理されるはずです - しかし、ライブラリには私のデータに 'id'フィールドがあるとは思わないかもしれません。 – AnjoMan

関連する問題