Saya mencoba menjalankan skrip PHP berikut untuk melakukan kueri basis data sederhana:
$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());
Ini menghasilkan kesalahan berikut:
Permintaan gagal: ERROR: relation "sf_bands" tidak ada
Dalam semua contoh yang saya dapat temukan di mana seseorang mendapat kesalahan yang menyatakan bahwa relasinya tidak ada, itu karena mereka menggunakan huruf besar dalam nama tabel mereka. Nama tabel saya tidak memiliki huruf besar. Apakah ada cara untuk query tabel saya tanpa menyertakan nama database, yaitu showfinder.sf_bands
?
php
sql
postgresql
quoted-identifier
Keyslinger
sumber
sumber
Jawaban:
Dari apa yang saya baca, kesalahan ini berarti Anda tidak mereferensikan nama tabel dengan benar. Salah satu alasan umum adalah bahwa tabel didefinisikan dengan ejaan case campuran, dan Anda mencoba untuk menanyakannya dengan semua huruf kecil.
Dengan kata lain, yang berikut ini gagal:
Gunakan tanda kutip ganda untuk membatasi pengidentifikasi sehingga Anda dapat menggunakan ejaan kasus campuran tertentu saat tabel ditentukan.
Re komentar Anda, Anda dapat menambahkan skema ke "search_path" sehingga ketika Anda mereferensikan nama tabel tanpa memenuhi syarat skema, kueri akan cocok dengan nama tabel dengan memeriksa setiap skema secara berurutan. Sama seperti
PATH
di shell atauinclude_path
di PHP, dll. Anda dapat memeriksa jalur pencarian skema Anda saat ini:Anda dapat mengubah jalur pencarian skema Anda:
Lihat juga http://www.postgresql.org/docs/8.3/static/ddl-schemas.html
sumber
SELECT * FROM SF_Bands
ini masih akan gagal, karena Postgres memutuskan untuk mengurangi nama tabel itu untuk Anda. Aneh ...Saya punya masalah dengan ini dan ini adalah ceritanya (sedih tapi benar):
Jika nama tabel Anda semua huruf kecil seperti: akun yang dapat Anda gunakan:
select * from AcCounTs
dan itu akan berfungsi dengan baikJika nama tabel Anda semuanya huruf kecil seperti:
accounts
Berikut ini akan gagal:select * from "AcCounTs"
Jika nama tabel Anda adalah case campuran seperti:
Accounts
Berikut ini akan gagal:select * from accounts
Jika nama tabel Anda adalah case campuran seperti:
Accounts
Berikut ini akan berfungsi OK:select * from "Accounts"
Saya tidak suka mengingat hal-hal yang tidak berguna seperti ini tetapi Anda harus;)
sumber
Accounts
, akan gagal denganselect * from Accounts;
saya menemukan bagian paling aneh: sama-kasus TIDAK identik.Permintaan proses Postgres berbeda dari RDMS lainnya. Masukkan nama skema dalam kutipan ganda di depan nama tabel Anda seperti ini, "SCHEMA_NAME". "SF_Bands"
sumber
Masukkan parameter dbname di string koneksi Anda. Ini bekerja untuk saya sementara yang lainnya gagal.
Juga saat melakukan pemilihan, tentukan
your_schema
.your_table
seperti ini:sumber
Saya memiliki masalah yang sama pada OSX tetapi mencoba untuk bermain-main dengan tanda kutip ganda dan tunggal. Untuk kasus Anda, Anda dapat mencoba sesuatu seperti ini
sumber
Ini sangat membantu
Saya menggali masalah ini lebih lanjut, dan menemukan tentang cara mengatur "search_path" ini dengan menghapus pengguna baru di basis data saat ini.
Buka DataBase Properties lalu buka Sheet "Variables" dan cukup tambahkan variabel ini untuk pengguna Anda dengan nilai aktual.
Jadi sekarang pengguna Anda akan mendapatkan schema_name ini dengan defoult dan Anda bisa menggunakan tableName tanpa schemaName.
sumber
Anda harus menulis nama skema dan nama tabel dalam tanda qutotation. Seperti di bawah ini:
sumber
Bagi saya masalahnya adalah, bahwa saya telah menggunakan query ke tabel tertentu sementara Django diinisialisasi. Tentu saja itu akan menimbulkan kesalahan, karena tabel-tabel itu tidak ada. Dalam kasus saya, itu adalah
get_or_create
metode dalam file admin.py, yang dieksekusi setiap kali perangkat lunak menjalankan segala jenis operasi (dalam hal ini migrasi). Semoga itu bisa membantu seseorang.sumber
Anda harus menambahkan skema pertama, mis
Jika Anda tidak ingin menambahkan itu di semua kueri lalu coba ini:
Sekarang akan berfungsi:
sumber
Solusi termudah adalah Hanya mengubah nama tabel dan semua nama kolom menjadi huruf kecil dan masalah Anda akan teratasi.
Sebagai contoh:
Table_Name
ketable_name
danColumnName
kecolumnname
sumber