PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Laporan Rails tidak dapat menemukan kolom yang ada di sana

Nama kolom SQL tidak peka huruf besar/kecil kecuali jika dikutip, standar mengatakan bahwa pengidentifikasi harus dinormalisasi menjadi huruf besar tetapi PostgreSQL dinormalisasi menjadi huruf kecil:

Mengutip pengidentifikasi juga membuatnya peka huruf besar/kecil, sedangkan nama yang tidak dikutip selalu dilipat menjadi huruf kecil. Misalnya, pengidentifikasi FOO , foo , dan "foo" dianggap sama oleh PostgreSQL, tetapi "Foo" dan "FOO" berbeda dari ketiganya dan satu sama lain. (Pelipatan nama yang tidak dikutip menjadi huruf kecil di PostgreSQL tidak sesuai dengan standar SQL, yang mengatakan bahwa nama yang tidak dikutip harus dilipat menjadi huruf besar. Jadi, foo harus sama dengan "FOO" bukan "foo" sesuai standar. Jika Anda ingin menulis aplikasi portabel, Anda disarankan untuk selalu mengutip nama tertentu atau tidak pernah mengutipnya.)

Anda mereferensikan Email di SQL Anda:

SELECT "bans".* FROM "bans"  WHERE (Email='' ...

tetapi PostgreSQL mengeluh tentang email :

column "email" does not exist

Email Anda yang tidak dikutip sedang diperlakukan sebagai email karena PostgreSQL menormalkan pengidentifikasi menjadi huruf kecil. Sepertinya Anda membuat kolom dengan nama yang dikapitalisasi dengan mengutip dua kali:

create table "bans" (
    "Email" varchar(...)
    ...
)

atau dengan menggunakan :Email untuk mengidentifikasi kolom dalam migrasi. Jika Anda mengutip nama kolom saat dibuat, maka itu tidak dinormalisasi menjadi huruf kecil (atau huruf besar dalam huruf standar SQL) dan Anda harus mengutipnya dua kali dan mencocokkan huruf besar selamanya:

SELECT "bans".* FROM "bans"  WHERE ("Email"='' ...

Setelah Anda memperbaiki Email , Anda akan memiliki masalah yang sama dengan IP , Username , Reason , dan Length :Anda harus menggandakan kutipan semuanya dalam SQL apa pun yang mereferensikannya.

Praktik terbaik adalah menggunakan nama kolom dan tabel dengan huruf kecil sehingga Anda tidak perlu khawatir tentang mengutip sesuatu sepanjang waktu. Sebaiknya perbaiki tabel Anda agar memiliki nama kolom huruf kecil.

Sebagai tambahan, 'NULL' your string literal:

SELECT "bans".* FROM "bans"  WHERE (Email='' AND IP='' AND (Username='NULL' ))
-- -------------------->------------------>---------->---------------^^^^^^

terlihat aneh, apakah Anda yakin tidak bermaksud "Username" is null ? 'NULL' string literal dan nilai NULL adalah hal yang sama sekali berbeda dan Anda tidak dapat menggunakan = atau != untuk membandingkan sesuatu dengan NULL, Anda harus menggunakan is null , is not null , is distinct from , atau is not distinct from (tergantung pada niat Anda) saat NULL mungkin dimainkan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Solusi Ruby generik untuk SQLite3 LIKE atau PostgreSQL ILIKE?

  2. Kembalikan dump pada mesin jarak jauh

  3. Trade-off dalam Penerapan Hot Standby

  4. Bagaimana to_date() Bekerja di PostgreSQL

  5. Cara Memeriksa apakah Array PostgreSQL Berisi Nilai