Kan niet zomaar de PostgreSQL-tabelnaam gebruiken ( relatie bestaat niet )

Ik probeer het volgende PHP-script uit te voeren om een ​​eenvoudige databasequery uit te voeren:

$db_host = "localhost";
$db_name = "showfinder";
$username = "user";
$password = "password";
$dbconn = pg_connect("host=$db_host dbname=$db_name user=$username password=$password")
    or die('Could not connect: ' . pg_last_error());
$query = 'SELECT * FROM sf_bands LIMIT 10';
$result = pg_query($query) or die('Query failed: ' . pg_last_error());

Dit levert de volgende fout op:

Query mislukt: FOUT: relatie “sf_bands” bestaat niet

In alle voorbeelden kan ik vinden waar iemand een foutmelding krijgt dat de relatie niet bestaat, omdat ze hoofdletters gebruiken in hun tabelnaam. Mijn tabelnaam heeft geen hoofdletters. Is er een manier om mijn tabel op te vragen zonder de databasenaam op te nemen, bijv. showfinder.sf_bands?


Antwoord 1, autoriteit 100%

Van wat ik heb gelezen, betekent deze fout dat je niet correct naar de tabelnaam verwijst. Een veelvoorkomende reden is dat de tabel is gedefinieerd met een spelling van gemengde letters en dat u deze probeert te doorzoeken met alleen kleine letters.

Met andere woorden, het volgende mislukt:

CREATE TABLE "SF_Bands" ( ... );
SELECT * FROM sf_bands;  -- ERROR!

Gebruik dubbele aanhalingstekens om id’s te scheiden, zodat u de specifieke spelling van hoofdletters kunt gebruiken zoals de tabel is gedefinieerd.

SELECT * FROM "SF_Bands";

Bij uw opmerking kunt u een schema toevoegen aan het “zoekpad”, zodat wanneer u naar een tabelnaam verwijst zonder het schema ervan te kwalificeren, de query overeenkomt met die tabelnaam door elk schema in volgorde te controleren. Net zoals PATHin de shell of include_pathin PHP, enz. U kunt uw huidige zoekpad voor schema’s controleren:

SHOW search_path
  "$user",public

U kunt het zoekpad van uw schema wijzigen:

SET search_path TO showfinder,public;

Zie ook http://www.postgresql.org/docs/ 8.3/static/ddl-schemas.html


Antwoord 2, autoriteit 24%

Ik had hier problemen mee en dit is het verhaal (treurig maar waar):

  1. Als uw tabelnaam alleen in kleine letters is, zoals: accounts
    je kunt gebruiken: select * from AcCounTsen het werkt prima

  2. Als uw tabelnaam geheel in kleine letters is, zoals: Accounts
    Het volgende zal mislukken:
    select * from "AcCounTs"

  3. Als uw tabelnaam een ​​gemengde naam heeft, zoals: Accounts
    Het volgende zal mislukken:
    select * from accounts

  4. Als uw tabelnaam een ​​gemengde naam heeft, zoals: Accounts
    Het volgende zal goed werken:
    select * from "Accounts"

Ik hou er niet van om me nutteloze dingen als deze te herinneren, maar je moet wel 😉


Antwoord 3, autoriteit 6%

Postgres-procesquery verschilt van andere RDMS. Zet schemanaam tussen dubbele aanhalingstekens voor uw tabelnaam, zoals dit, “SCHEMA_NAME”.”SF_Bands”


Antwoord 4, autoriteit 6%

Plaats de parameter dbname in uw verbindingsreeks. Het werkt voor mij terwijl al het andere faalde.

Ook bij het selecteren, specificeert u het your_schema.your_tableals volgt:

select * from my_schema.your_table

Antwoord 5, autoriteit 3%

Ik had een soortgelijk probleem op OSX, maar probeerde te spelen met dubbele en enkele aanhalingstekens. In jouw geval zou je zoiets als dit kunnen proberen

$query = 'SELECT * FROM "sf_bands"'; // NOTE: double quotes on "sf_Bands"

Antwoord 6, autoriteit 2%

U moet de schemanaam en tabelnaam in aanhalingstekens schrijven. Zoals hieronder:

select * from "schemaName"."tableName";

Antwoord 7, autoriteit 2%

Dit is erg handig

SET search_path TO schema,public;

Ik heb dit probleem verder uitgediept en ontdekt hoe ik dit “zoekpad” standaard kan instellen voor een nieuwe gebruiker in de huidige database.

Open DataBase-eigenschappen en open vervolgens Blad “Variabelen”
en voeg eenvoudig deze variabele voor uw gebruiker toe met de werkelijke waarde.

Dus nu krijgt uw gebruiker standaard deze schema_name en kunt u tableName gebruiken zonder schemaName.


Antwoord 8

Als een tabelnaam underscores of hoofdletters bevat, moet u deze tussen dubbele aanhalingstekens plaatsen.

SELECT * from "Table_Name";

Antwoord 9

Voor mij was het probleem dat ik een query naar die specifieke tabel had gebruikt terwijl Django was geïnitialiseerd. Natuurlijk zal het dan een foutmelding geven, omdat die tabellen niet bestonden. In mijn geval was het een get_or_create-methode binnen een admin.py-bestand, die werd uitgevoerd wanneer de software een bewerking uitvoerde (in dit geval de migratie). Hoop dat dat iemand helpt.


Antwoord 10

De eenvoudigste oplossing is om de tabelnaam en alle kolomnamen te wijzigen in kleine lettersen uw probleem is opgelost.

Bijvoorbeeld:

  • Verander table_namein table_nameen
  • Verander ColumnNamein ColumnName

Antwoord 11

Ik had hetzelfde probleem als hierboven en ik gebruik PostgreSQL 10.5.
Ik heb alles geprobeerd zoals hierboven, maar niets lijkt te werken.

Toen sloot ik de pgadmin en opende ik een sessie voor de PSQL-terminal.
Aangemeld bij de PSQL en verbonden met respectievelijk de database en het schema:

\c <DATABASE_NAME>;
set search_path to <SCHEMA_NAME>;

Vervolgens herstartte ik de pgadmin-console en toen kon ik probleemloos werken in de query-tool van de pagadmin.


Antwoord 12

Je moet eerst het schema toevoegen, bijvoorbeeld

SELECT * FROM place.user_place;

Als je dat niet in alle zoekopdrachten wilt toevoegen, probeer dan dit:

SET search_path TO place;

Nu zal het werken:

SELECT * FROM user_place;

Antwoord 13

Het is misschien gek voor enkelen, maar in mijn geval – toen ik de tabel eenmaal had gemaakt, kon ik de tabel opvragen in dezelfde sessie, maar als ik me opnieuw aanmeld met een nieuwe sessie, wordt table does not exits.

Toen gebruikte ik commitnet nadat ik de tabel had gemaakt en nu kon ik de tabel ook in de nieuwe sessie vinden en opvragen. Zoals dit:

select * from my_schema.my_tbl;

Ik hoop dat dit enkelen zou helpen.


Antwoord 14

In aanvulling op Bill Karwin’santwoord =>

Ja, u moet de tabelnaam tussen double quotesplaatsen. Houd er echter rekening mee dat php waarschijnlijk niet toestaatdat u eenvoudigweg schrijft:

$query = "SELECT * FROM "SF_Bands"";

In plaats daarvan moet u single quotesgebruiken terwijl u de queryomringt als sav zei.

$query = 'SELECT * FROM "SF_Bands"';

Other episodes