복붙노트

PostgreSQL 테이블 이름을 단순히 사용할 수 없습니다 ( "관계가 없습니다").

PHP

PostgreSQL 테이블 이름을 단순히 사용할 수 없습니다 ( "관계가 없습니다").

간단한 데이터베이스 쿼리를 수행하려면 다음 PHP 스크립트를 실행하려고합니다.

$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());

이로 인해 다음과 같은 오류가 발생합니다.

모든 예제에서 관계가 존재하지 않는다는 오류를 누군가가 어디서 발견했는지는 찾을 수 있습니다. 테이블 이름에 대문자를 사용했기 때문입니다. 내 테이블 이름에 대문자가 없습니다. 데이터베이스 이름 (예 : showfinder.sf_bands)을 포함하지 않고 내 테이블을 쿼리하는 방법이 있습니까?

해결법

  1. ==============================

    1.내가 읽은 바로는이 오류는 테이블 이름을 올바르게 참조하지 않는다는 의미입니다. 한 가지 일반적인 이유는 테이블이 대소 문자가 혼합 된 맞춤법으로 정의되어 있고 모든 소문자로 쿼리하려고하기 때문입니다.

    내가 읽은 바로는이 오류는 테이블 이름을 올바르게 참조하지 않는다는 의미입니다. 한 가지 일반적인 이유는 테이블이 대소 문자가 혼합 된 맞춤법으로 정의되어 있고 모든 소문자로 쿼리하려고하기 때문입니다.

    즉, 다음과 같은 경우 실패합니다.

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

    큰 따옴표를 사용하여 식별자를 구분하면 테이블이 정의 될 때 대소 문자를 혼합하여 사용할 수 있습니다.

    SELECT * FROM "SF_Bands";
    

    주석을 다시 작성하면 "search_path"에 스키마를 추가하여 스키마를 한정하지 않고 테이블 이름을 참조 할 때 각 스키마를 순서대로 검사하여 해당 테이블 이름과 일치시킬 수 있습니다. 셸의 PATH 또는 PHP의 include_path와 같습니다. 현재 스키마 검색 경로를 확인할 수 있습니다.

    SHOW search_path
      "$user",public
    

    스키마 검색 경로를 변경할 수 있습니다.

    SET search_path TO showfinder,public;
    

    http://www.postgresql.org/docs/8.3/static/ddl-schemas.html을 참조하십시오.

  2. ==============================

    2.나는 이것에 문제가 있었고 이것은 이야기 (슬프지만 사실)이다.

    나는 이것에 문제가 있었고 이것은 이야기 (슬프지만 사실)이다.

    이런 쓸모없는 것을 기억하고 싶지는 않지만 그럴 필요는 있습니다.)

  3. ==============================

    3.Postgres는 다른 RDMS와 다른 쿼리를 처리합니다. 테이블 이름 앞에 "SCHEMA_NAME"과 같이 스키마 이름을 큰 따옴표로 묶습니다. "SF_Bands"

    Postgres는 다른 RDMS와 다른 쿼리를 처리합니다. 테이블 이름 앞에 "SCHEMA_NAME"과 같이 스키마 이름을 큰 따옴표로 묶습니다. "SF_Bands"

  4. ==============================

    4.dbname 매개 변수를 연결 문자열에 넣으십시오. 다른 모든 것이 실패하는 동안 그것은 나를 위해 작동합니다.

    dbname 매개 변수를 연결 문자열에 넣으십시오. 다른 모든 것이 실패하는 동안 그것은 나를 위해 작동합니다.

    또한 select를 수행 할 때 your_schema.your_table을 다음과 같이 지정하십시오.

    select * from my_schema.your_table
    
  5. ==============================

    5.나는 OSX에서 비슷한 문제를 겪었지만 두 배와 작은 따옴표로 놀려고했다. 당신의 경우에는 다음과 같이 시도 할 수 있습니다.

    나는 OSX에서 비슷한 문제를 겪었지만 두 배와 작은 따옴표로 놀려고했다. 당신의 경우에는 다음과 같이 시도 할 수 있습니다.

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

    6.나에게있어서 문제는 장고가 초기화되는 동안 그 특정 테이블에 대한 쿼리를 사용했다는 것이다. 물론 테이블이 존재하지 않기 때문에 오류가 발생합니다. 필자의 경우 admin.py 파일 내의 get_or_create 메소드로, 소프트웨어가 어떤 종류의 작업 (이 경우 마이그레이션)을 실행할 때마다 실행되었다. 희망은 누군가를 돕습니다.

    나에게있어서 문제는 장고가 초기화되는 동안 그 특정 테이블에 대한 쿼리를 사용했다는 것이다. 물론 테이블이 존재하지 않기 때문에 오류가 발생합니다. 필자의 경우 admin.py 파일 내의 get_or_create 메소드로, 소프트웨어가 어떤 종류의 작업 (이 경우 마이그레이션)을 실행할 때마다 실행되었다. 희망은 누군가를 돕습니다.

  7. ==============================

    7.이것은 정말로 도움이된다.

    이것은 정말로 도움이된다.

    SET search_path TO schema,public;
    

    나는이 문제를 더 파고 현재 데이터베이스에서 새로운 사용자에 대해이 "search_path"를 defoult로 설정하는 방법을 알아 냈습니다.

    DataBase 등록 정보를 연 다음 시트 "변수"를 엽니 다. 실제 값으로 사용자에게이 변수를 추가하기 만하면됩니다.

    이제 사용자는 기본적으로이 schema_name을 가져오고 스키마 이름없이 테이블 이름을 사용할 수 있습니다.

  8. from https://stackoverflow.com/questions/695289/cannot-simply-use-postgresql-table-name-relation-does-not-exist by cc-by-sa and MIT license