2017-11-05 2 views
0

Ich verwende die Bibliothek dataset, um zu versuchen, eine Postgres-Datenbank in einer SQLite-Datei zu sichern. Der Code, den ich laufen geht wie folgt:Fehler: versuchen, einen Primärschlüssel als Nicht-Primärschlüssel neu zu definieren

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) 

Wenn ich eine Zeile der Tabelle zu drucken, es sieht wie folgt aus:

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

Allerdings, wenn ich an die Leitung bekommen save_to['outlook'].insert(row) ich eine bekommen Fehler beim folgenden Stack-Trace:

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' 

Irgendwelche Ideen, was ich falsch mache? Ich habe das in Python 2.7.14 und 3.6.3 versucht

+0

schlägt es beim zweiten Einsatz fehl? – Dionys

+0

Was ist ein "Nicht-Primärschlüssel"? – wildplasser

Antwort

0

Ich habe es herausgefunden! Der Trick besteht also darin, dass die Bibliothek database standardmäßig Tabellen mit einem automatisch inkrementierenden ganzzahligen Primärschlüssel erstellt. Aber meine Daten haben bereits eine ID-Spalte. Um das Problem zu vermeiden, sollte ich meine Tabelle zu definieren, bevor ich versuche, Linien, um es hinzuzufügen, und definieren es ohne Primärschlüssel Sie wie folgt vor:

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) 

von .create_table(table_name, primary_key=False) tun ich sicherstellen kann, dass ich mein einfügen eigene ID-Werte in der Tabelle.

Ich fand diese Lösung von reading the docs.

1

Angenommen, Sie haben ein Schema und eine Tabelle für "Outlook" gemacht, haben Sie ein PK-Feld? Haben Sie sqlite entscheiden lassen, in welchem ​​Feld ein PK-Feld erstellt werden soll?

Es ist sehr wichtig, dass Sie versuchen, ID zweimal einzugeben. Einmal fügt sqlite sich selbst ein und andere kommen von den anderen Tabellensätzen.

+0

Das macht Sinn. Ich definiere kein Schema - das soll von der Bibliothek erledigt werden - aber es könnte sein, dass die Bibliothek einfach nicht denkt, dass ich ein "ID" -Feld in meinen Daten haben würde. – AnjoMan

Verwandte Themen