2017-10-11 2 views
-1

Intro: Ich habe an der Erstellung einer Python-gestützten PostgreSQL-Datenbank eines Swiss-Style-Turniers mit Vagrant gearbeitet, die eine Ubuntu-VM für meine relationale Datenbank in Udacity ausführt.Python-unterstützte SQL-Datenbank, die einen Fehler psycopg2.ProgrammingError: Relation existiert nicht zurückgibt, wenn versucht wird, die Daten in einer Tabelle zu löschen?

Frage: Warum heißt es, dass die Tabelle nicht existiert, wenn ich versuche, die Informationen in der vorhandenen Tabelle zu löschen?

Ich habe eine generische Suche

psycopg2.ProgrammingError 

, zu erforschen, aber die Informationen auf andere Umstände meist spezifisch, und ich war nicht in der Lage der logischen Verbindungen zu machen, die mir dieses Problem beheben erlauben würden. Ich fand auch einen anderen Stack Overflow-Thread, der dem gleichen Problem other thread here nahe ist, aber dieses Problem wurde auch nie gelöst. Also habe ich diese Frage gestellt, indem ich versuche, jemanden zu finden, der in der Lage ist, mein Rätsel zu verstehen und mir eine Art Hinweis oder Hinweis zu geben, um mich in die richtige Richtung zu bringen.

Ich habe die Turnierdatenbank SQL-Datei in die Vagrant VM importiert. Dies löschte die zwei Tabellen (Spieler und Matches) und die Datenbank (Turnier) und erstellt dann diese Datenbank und diese Tabellen neu. Also ich weiß, dass die Tabelle (Übereinstimmungen) existiert. Aber das ist, was ich erhalte ...

Vagrant: (aktuelle vagrant Fehler)

[email protected]:/vagrant/tournament$ python tournament_test.py 
Traceback (most recent call last): 
    File "tournament_test.py", line 151, in <module> 
    testCount() 
    File "tournament_test.py", line 17, in testCount 
    deleteMatches() 
    File "/vagrant/tournament/tournament.py", line 18, in deleteMatches 
    cursor.execute("DELETE FROM matches;") 
psycopg2.ProgrammingError: relation "matches" does not exist 
LINE 1: DELETE FROM matches; 
        ^

SQL: (Alle von tournament.sql)

-- Table definitions for the tournament project. 
-- 
-- Put your SQL 'create table' statements in this file; also 'create view' 
-- statements if you choose to use it. 
-- 
-- You can write comments in this file by starting them with two dashes, 
like 
-- these lines here. 
DROP TABLE matches; 
DROP TABLE players; 
DROP DATABASE tournament; 
CREATE DATABASE tournament; 


CREATE TABLE players (player_id SERIAL UNIQUE PRIMARY KEY, name 
VARCHAR(40)); 
CREATE TABLE matches (match_id SERIAL UNIQUE PRIMARY KEY, 
         winner INTEGER REFERENCES players(player_id), 
         loser INTEGER REFERENCES players (player_id)); 

Python: (Minimal aus tournament.py)

#!/usr/bin/env python 
# 
# tournament.py -- implementation of a Swiss-system tournament 
# 

import psycopg2 


def connect(): 
    """Connect to the PostgreSQL database. Returns a database 
connection.""" 
    return psycopg2.connect("dbname=tournament") 


def deleteMatches(): 
    """Remove all the match records from the database.""" 
    db = connect() 
    cursor = db.cursor() 
    cursor.execute("TRUNCATE matches CASCADE;") 
    db.commit() 
    db.close() 

Python: (minimal von tournament_test.py) Dies ist die Datei, die die tournament.py verifiziert Funktionen arbeiten mit der Datenbank Turnier.sql.

#!/usr/bin/env python 
# 
# Test cases for tournament.py 

from tournament import * 

def testCount(): 
    """ 
    Test for initial player count, 
      player count after 1 and 2 players registered, 
      player count after players deleted. 
    """ 
    deleteMatches() 
    deletePlayers() 
    c = countPlayers() 
    if c == '0': 
     raise TypeError(
      "countPlayers should return numeric zero, not string '0'.") 
    if c != 0: 
     raise ValueError("After deletion, countPlayers should return zero.") 
    print "1. countPlayers() returns 0 after initial deletePlayers() 
execution." 
    registerPlayer("Chandra Nalaar") 
    c = countPlayers() 
    if c != 1: 
     raise ValueError(
      "After one player registers, countPlayers() should be 1. Got 
{c}".format(c=c)) 
    print "2. countPlayers() returns 1 after one player is registered." 
    registerPlayer("Jace Beleren") 
    c = countPlayers() 
    if c != 2: 
     raise ValueError(
      "After two players register, countPlayers() should be 2. Got 
{c}".format(c=c)) 
    print "3. countPlayers() returns 2 after two players are registered." 
    deletePlayers() 
    c = countPlayers() 
    if c != 0: 
     raise ValueError(
      "After deletion, countPlayers should return zero.") 
    print "4. countPlayers() returns zero after registered players are 
deleted.\n5. Player records successfully deleted." 

testCount() 

Vagrant (Bestätigung, dass die Tabelle 'Streichhölzer' existiert in der Datenbank):

vagrant=> \dt 
     List of relations 
Schema | Name | Type | Owner 
--------+---------+-------+--------- 
public | matches | table | vagrant 
public | players | table | vagrant 
(2 rows) 

Update2: Klärung

Kommentar ich zu Beginn meiner Python-Datei an die DB verbinden .

def connect() 
    """Connect to the PostgreSQL database. Returns a database 
    connection.""" 
    return psycopg2.connect("dbname=tournament") 
+0

Wie verbinden Sie sich mit der db? –

+0

Hallo. Das sind viele nützliche Informationen. Bitte lesen und handeln Sie auch auf [mcve]. Was haben Sie auch aus dem googeln der Fehlermeldung gelernt, ohne Ihre spezifischen Tabellen-/Spalten-/Constraint/etc-Namen? Bitte bearbeiten Sie Klarstellungen in Ihre Frage, nicht in Kommentare. Bitte, anstatt Updates Stück für Stück zu hängen, halten Sie Ihre Frage aktuell und in sich abgeschlossen. (Vorherige Versionen sind über den 'editierten' Link erreichbar.) – philipxy

+0

Danke. A [mcve] ist ein minimales Beispiel, keine minimalen Auszüge. (Außerdem gibt Ihr edit2 nur Text wieder, der bereits in Ihrer Frage enthalten ist.) Es bedeutet, dass vollständige Dateien einschließlich eines Skripts ohne Bearbeitung durch jemanden mit der entsprechenden installierten Software (python/vagrant/postgresql) mit minimalem Code, der das Problem aufweist, ausgeführt werden können. Nicht Auszüge "von" solchen Dateien. Wenn die Ausführung beendet wird, wenn deleteMatches in tournament_test.py aufgerufen wird, warum sollte dann später Code aus dieser Datei nicht ausgeführt werden? PS Warum sagt Ihr Vagrant Fehler "DELETE FROM Übereinstimmungen" Wenn tournament.py sagt "TRUNCATE stimmt mit CASCADE überein"? – philipxy

Antwort

0

Dies war Benutzerfehler. Ich habe mich falsch mit der Vagabund und der Turnierdatenbank verbunden.

Nach der Anmeldung in Vagabund war ich in den richtigen Ordner Zugriff auf die richtige Datenbank, aber in der falschen Methode.

Fehler:

Einmal in Vagabund Ich ging als Benutzer Vagabund psql und die Datei importiert.

\i tournament.sql 

Dann habe ich mit der Datenbank verbunden.

Dann habe ich psql verlassen, um die Datei zu starten und die Beziehung nicht existiert Fehler.

Ich musste noch einen Schritt machen.

UPDATE:

Sobald die Verbindung hergestellt und protokolliert in die Datenbank Turnier. Ich musste die Datei Turnier.SQL erneut importieren.

Das erstellte die Beziehungen innerhalb der eigentlichen Datenbank und nicht nur vagabund oder wo auch immer ich sie zuvor erstellt habe.

so von Vagrant nach dem Befehl Vagrant ssh # führen Sie diese Befehle separat cd/Vagabund/Turnier/

psql 

\i tournament.sql 

\c tournament 

\i tournament 

#last check to verify your relations were created 
\dt 
\d (table or view) 

das, was es für mich getan ist. Der Rest des Projekts war einfach. Ich hoffe, dies hilft jedem, der hier nach der Antwort sucht und nur unbeantwortete, aber stark kritisierte Fragen findet. Danke an alle Experten, die meine Anfängerfrage gesehen haben und mir entweder negative Punkte gegeben haben oder aufgehört haben, das Format meiner Frage zu kritisieren. Ich lerne immer noch und wenn jemand von euch mir geholfen hätte, dies zu verstehen oder zu lösen, wäre ich nicht in der Lage gewesen, alles alleine in 3 Tagen zu machen.

Verwandte Themen