Python支持SQL数据库返回psycopg2.ProgrammingError:在尝试删除表中的数据时,关系不存在错误?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python支持SQL数据库返回psycopg2.ProgrammingError:在尝试删除表中的数据时,关系不存在错误?相关的知识,希望对你有一定的参考价值。

简介:我一直致力于使用Vagrant为Udacity中的关系数据库课程运行Ubuntu VM,构建一个瑞士风格锦标赛的Python支持的PostgreSQL数据库。

问题:当我尝试删除现有表中的信息时,为什么说该表不存在?

我做了一般搜索研究

psycopg2.ProgrammingError

,但信息主要针对其他情况,我无法建立逻辑连接,可以解决这个问题。我还发现另一个Stack Overflow线程接近同一个问题other thread here,但是这个问题也从未得到解决。所以我创造了这个问题,试图找到一个能够理解我的难题的人,并提供某种暗示或线索让我朝着正确的方向努力。

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

流浪者:(当前的流浪错误)

vagrant@vagrant:/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.
5. Player records successfully deleted."

testCount()

Vagrant(确认表'匹配'存在于数据库中):

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

Update2:澄清评论

我在python文件的开头连接到db。

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

这是用户错误。我以错误的方式连接到vagrant和锦标赛数据库。

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

错误:

一旦进入vagrant,我就以用户vagrant的身份访问了psql并导入了该文件。

i tournament.sql

然后我连接到数据库。

c tournament

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

我还需要再做一步。

固定:

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

这创造了实际数据库中的关系,而不仅仅是流浪者或以前在我创建它们的任何地方。

所以从Vagrant命令之后Vagrant ssh#分别运行这些命令cd / vagrant / tournament /

psql

i tournament.sql

c tournament

i tournament

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

这就是为我做的事情。项目的其余部分很简单。我希望这有助于任何人在这里寻找答案,只找到更多未答复但批评严厉的问题。感谢所有看过我的初学者问题的专家,要么给我负面评价,要么停下来批评我的问题格式。我还在学习,如果你们中的任何人真的帮助我理解或解决了这个问题,我将无法在3天的时间内完成所有工作。

以上是关于Python支持SQL数据库返回psycopg2.ProgrammingError:在尝试删除表中的数据时,关系不存在错误?的主要内容,如果未能解决你的问题,请参考以下文章

python使用psycopg2

使用 psycopg2 编写动态 SQL 字符串

尝试使用 psycopg2.sql 在 python 中创建 Redshift 表

在 Python 中的 psycopg2 中执行 .sql 模式

中断键时使用 psycopg2 终止未完成的 SQL 提交查询

Psycopg2 在 postgres 数据库中插入 python 字典