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:在尝试删除表中的数据时,关系不存在错误?的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 psycopg2.sql 在 python 中创建 Redshift 表
在 Python 中的 psycopg2 中执行 .sql 模式