2009-03-29 24 views
95

Tôi đang cố gắng để chạy các script PHP sau đây để làm một truy vấn cơ sở dữ liệu đơn giản:có thể không chỉ đơn giản là sử dụng tên bảng PostgreSQL ("mối quan hệ không tồn tại")

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

này tạo ra các lỗi sau:

Query failed: ERROR: relation "sf_bands" does not exist

Trong tất cả các ví dụ, tôi có thể tìm thấy nơi ai đó gặp phải lỗi báo hiệu mối quan hệ không tồn tại, đó là vì họ sử dụng chữ in hoa trong tên bảng của họ. Tên bảng của tôi không có chữ hoa. Có cách nào để truy vấn bảng của tôi mà không bao gồm tên cơ sở dữ liệu, tức là showfinder.sf_bands không?

+2

Bạn có chắc chắn rằng bảng sf_bands tồn tại không? Showfinder.sf_bands có hoạt động không? –

+1

showfinder.sf_bands hoạt động hoàn hảo – Keyslinger

+0

Có lẽ tôi nên lưu ý rằng cơ sở dữ liệu của tôi đã được di chuyển từ MySQL – Keyslinger

Trả lời

189

Từ những gì tôi đã đọc, lỗi này có nghĩa là bạn không tham chiếu tên bảng chính xác. Một lý do phổ biến là bảng được xác định bằng chính tả hỗn hợp và bạn đang cố truy vấn nó với tất cả các chữ thường.

Nói cách khác, sau thất bại:

CREATE TABLE "SF_Bands" (...); 

SELECT * FROM sf_bands; -- ERROR! 

Sử dụng hai dấu ngoặc kép để phân định, do đó bạn có thể sử dụng hỗn hợp trường hợp chính tả cụ thể như bảng được định nghĩa.

SELECT * FROM "SF_Bands"; 

Re bình luận của bạn, bạn có thể thêm một giản đồ đến "search_path" để khi bạn tham khảo một tên bảng mà không đủ điều kiện sơ đồ của nó, truy vấn sẽ phù hợp với cái tên bảng bằng cách kiểm tra mỗi lược đồ trong trật tự . Cũng giống như PATH trong vỏ hoặc include_path trong PHP, vv Bạn có thể kiểm tra đường dẫn tìm kiếm sơ đồ hiện tại của bạn:

SHOW search_path 
    "$user",public 

Bạn có thể thay đổi đường dẫn tìm kiếm schema của bạn:

SET search_path TO showfinder,public; 

Xem thêm http://www.postgresql.org/docs/8.3/static/ddl-schemas.html

+0

Rất tiếc, hãy tha thứ cho tôi. Tôi có nghĩa là để nói rằng tên bảng của tôi không có chữ hoa, không phải tên cơ sở dữ liệu của tôi. – Keyslinger

+9

Có vẻ như ngay cả khi bạn gõ 'SELECT * FROM SF_Bands' thì điều này vẫn không thành công, vì Postgres quyết định viết tên bảng đó cho bạn. Weird ... –

+3

@romkyns: Vâng, điều này thực sự khá phổ biến trên các thương hiệu RDBMS, rằng số nhận dạng không giới hạn được quảng cáo là "không phân biệt chữ hoa chữ thường". Nhưng chúng thực sự không phân biệt chữ hoa chữ thường vì cách chúng đã triển khai đó là ép buộc chữ thường. Điều này khớp với tên của bảng chỉ khi bạn đã cho phép tên bảng được hạ thấp khi bạn xác định bảng. Nếu bạn sử dụng dấu phân tách kép khi bạn TẠO TABLE, bạn phải sử dụng dấu phân cách khi bạn tham chiếu nó trong truy vấn. –

9

Đặt tham số dbname trong chuỗi kết nối của bạn. Nó làm việc cho tôi trong khi mọi thứ khác thất bại.

Ngoài ra khi thực hiện lựa chọn, hãy chỉ định your_schema. your_table như sau:

select * from my_schema.your_table 
+0

Đặt tên lược đồ vào, ví dụ: my_schema.my_relation vào truy vấn đã giúp. – JoeTidee

+0

Cảm ơn bạn rất nhiều! Nó reall giúp tôi giải quyết vấn đề! Nhưng có cách nào để tôi có thể bỏ qua tên lược đồ không? – Charlotte

9

Truy vấn quá trình Postgres khác với RDMS khác. Đặt tên lược đồ trong dấu ngoặc kép trước tên bảng của bạn như thế này, "SCHEMA_NAME"."SF_Bands"

+4

Câu trả lời của bạn sẽ thêm vào câu trả lời được chấp nhận trước đây, tăng gấp 22 lần và với nhiều chi tiết? – Yaroslav

41

Tôi đã có vấn đề với điều này và đây là những câu chuyện (buồn nhưng là sự thật):

  1. Nếu tên bảng của bạn là tất cả các trường hợp thấp hơn như: tài khoản bạn có thể sử dụng: select * from AcCounTs và nó sẽ hoạt động tốt

  2. Nếu tên bảng của bạn là tất cả các trường hợp thấp hơn như: accounts sau đây sẽ thất bại: select * from "AcCounTs"

  3. Nếu tên bảng của bạn là trường hợp hỗn hợp như: Accounts Sau đây sẽ thất bại: select * from accounts

  4. Nếu tên bảng của bạn là trường hợp hỗn hợp như: Accounts Sau đây sẽ làm việc OK: select * from "Accounts"

Tôi không thích ghi nhớ những nội dung vô dụng như thế này nhưng bạn phải;)

+0

Tương tự cho các tên cột trong trường hợp mệnh đề – Roland

+5

5. Trường hợp hỗn hợp, như 'Tài khoản', sẽ thất bại với' chọn * từ Tài khoản; 'Tôi tìm phần kỳ lạ nhất: cùng một trường hợp KHÔNG giống nhau. – Roland

+1

Tất cả đều có: tất cả các tên trong truy vấn postgres đều là chữ thường, trừ khi bạn sử dụng dấu ngoặc kép. – Erndob

2

Tôi gặp sự cố tương tự trên OSX nhưng đã cố gắng phát aro und với dấu nháy kép và đơn. Trong trường hợp của bạn, bạn có thể thử một cái gì đó như thế này

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

Đối với tôi vấn đề là, tôi đã sử dụng truy vấn tới bảng cụ thể đó trong khi Django được khởi tạo. Tất nhiên sau đó nó sẽ ném một lỗi, bởi vì những bảng đó không tồn tại. Trong trường hợp của tôi, nó là phương thức get_or_create trong tệp admin.py, được thực thi bất cứ khi nào phần mềm chạy bất kỳ loại hoạt động nào (trong trường hợp này là di chuyển). Hy vọng rằng sẽ giúp một ai đó.

Các vấn đề liên quan