2017-10-11 94 views
-1

简介:我一直在使用Vagrant为Udacity中的Relational Database课程运行Ubuntu VM构建一个支持Python的PostgreSQL瑞士风格锦标赛数据库。Python支持的SQL数据库返回psycopg2.ProgrammingError:尝试删除表中的数据时不存在错误?

问题:为什么当我试图删除现有表内的信息时表不存在?

我做了一个通用搜索研究

psycopg2.ProgrammingError 

,但是这些信息主要是针对其他情况,我无法做出逻辑连接,让我解决这个问题。我还发现另一个堆栈溢出线程接近相同的问题other thread here,但该问题也未解决。所以我创造了这个问题,试图找到能够理解我的难题的人,并提供某种暗示或线索让我朝着正确的方向工作。

我已经将锦标赛数据库SQL文件导入到Vagrant VM中。这删除了两个表(球员和比赛)和数据库(锦标赛),然后重新创建这个数据库和这些表。所以我知道表(匹配)存在。然而,这就是我得到...

流浪:(当前流浪汉错误)

[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:(所有的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:(从最小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:(最小自tournament_test.py)这是验证tournament.py文件函数与tournament.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=> \dt 
     List of relations 
Schema | Name | Type | Owner 
--------+---------+-------+--------- 
public | matches | table | vagrant 
public | players | table | vagrant 
(2 rows) 

UPDATE2:澄清评论

我连接到数据库,在我的Python文件的开头。

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

你如何连接到数据库? –

+0

嗨。这是很多有用的信息。请同时阅读[mcve]并采取行动。另外,你从Google错误消息中学到了什么,可以避免你的特定表/列/约束/等名字?请在你的问题中编辑澄清,而不是评论。请不要在零碎的情况下追加更新,只是让您的问题保持最新和独立。 (以前的版本可通过'编辑'链接访问。) – philipxy

+0

谢谢。 [mcve]是一个小例子,不是最基本的摘录。 (另外,你EDIT2只是再现文本已经在你的问题。)这意味着,全文件,包括可以在不编辑有人用包含最少的代码出现该问题安装相应的软件(蟒蛇/流浪者/ PostgreSQL系统)运行的脚本。不摘录“来自”这样的文件。另外,如果在tournament_test.py中调用deleteMatches时执行停止,那么为什么后面的代码不能执行? PS为什么你的流浪者错误说“删除匹配;”当tournament.py说“”TRUNCATE匹配CASCADE;“? – philipxy

回答

0

这是用户错误。我以错误的方式连接到流浪者和比赛数据库。

登录到vagrant后,我在正确的文件夹访问正确的数据库,但方法错误。

错误:

一旦流浪汉我去给psql为用户流浪汉,导入的文件。

\i tournament.sql 

然后我连接到数据库。

\c tournament 

然后,我退出psql运行该文件,并得到关系不存在的错误。

我需要做的一个步骤。

修正:

一旦连接并登录到数据库比赛。我需要再次导入tournament.sql文件。

创建关系实际的数据库中,而不仅仅是流浪汉或其它地方,我之前创建它们。

所以游民命令流浪SSH后 #单独运行这些命令 CD /流浪者/赛/

psql 

\i tournament.sql 

\c tournament 

\i tournament 

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

这就是为我做。该项目的其余部分很容易。我希望这可以帮助任何人在这里寻找答案,只找到更多没有答案,但严重批评的问题。感谢所有看到我的初学者问题的专家,他们给我不利的观点或停下来批评我的问题的格式。我仍然在学习,如果你们中的任何一个实际上帮助我理解或解决了这个问题,我将不能在3天的时间内完成这一切。

相关问题