GQL adalah bahasa yang mirip SQL dengan fungsi untuk mengambil entity dan kunci. Sintaksis untuk kueri GQL mirip dengan SQL. Halaman ini merupakan referensi untuk menggunakan GQL dengan library klien Python NDB dan DB.
GQL dipetakan secara kasar ke SQL: Anda dapat menganggap kind
GQL sebagai tabel SQL, entity
GQL
sebagai baris SQL, dan property
GQL sebagai kolom SQL. Namun, pencarian baris-kolom SQL adalah nilai tunggal, sedangkan di GQL, nilai properti dapat berupa daftar.
Versi GQL
Anda memerlukan versi GQL yang berbeda, bergantung pada tempat Anda menjalankan kueri. Ada dua referensi GQL:
-
Referensi GQL untuk Python NDB/DB, untuk tata bahasa GQL yang digunakan dalam library klien NDB dan DB (gunakan referensi di halaman ini).
- Referensi GQL, untuk tata bahasa GQL yang digunakan dalam Datastore API saat ini dan Viewer Datastore konsol Google Cloud.
Sintaksis
Sintaksis GQL untuk Python NDB/DB dapat dirangkum sebagai berikut:
SELECT [DISTINCT] [* | <property list> | __key__] [FROM <kind>] [WHERE <condition> [AND <condition> ...]] [ORDER BY <property> [ASC | DESC] [, <property> [ASC | DESC] ...]] [LIMIT [<offset>,]<count>] [OFFSET <offset>] <property list> := <property> [, <property> ...] <condition> := <property> {< | <= | > | >= | = | != } <value> <condition> := <property> IN <list> <condition> := ANCESTOR IS <entity or key> <list> := (<value> [, <value> ...]])
Seperti halnya SQL, kata kunci GQL tidak peka pada huruf besar/kecil. Nama jenis dan properti peka pada huruf besar/kecil.
GQL hanya mendukung pernyataan SELECT
.
Kueri GQL menampilkan nol atau beberapa entity, entity yang diproyeksikan, atau kunci dari jenis yang diminta. Setiap kueri GQL selalu dimulai dengan SELECT *
, SELECT __key__
, atau SELECT <property list>, dengan property adalah daftar yang dipisahkan koma yang berisi satu atau beberapa properti entity yang akan ditampilkan dari kueri. (Kueri GQL tidak dapat menjalankan kueri "join"
seperti SQL.)
Tips: Kueri SELECT __key__ or SELECT
<property list>
lebih cepat dan menggunakan lebih sedikit waktu
CPU daripada kueri SELECT *
.
Klausa DISTINCT
(eksperimental) opsional
menentukan bahwa hanya hasil yang benar-benar unik yang akan ditampilkan dalam kumpulan hasil. Tindakan ini
hanya akan menampilkan hasil pertama untuk entity yang memiliki nilai yang sama untuk properti
yang sedang diproyeksikan.
Klausa FROM
opsional membatasi hasil yang ditetapkan pada entity
dari jenis tertentu. Kueri tanpa klausa FROM
disebut sebagai kueri yang tidak serupa dan hanya dapat memiliki WHERE
yang menentukan properti __key__
.
Klausa WHERE
opsional membatasi hasil yang ditetapkan pada entity yang memenuhi satu atau beberapa kondisi. Setiap kondisi membandingkan properti entity dengan nilai menggunakan operator perbandingan. Jika beberapa kondisi diberikan dengan kata kunci AND
, entity harus memenuhi semua kondisi yang akan ditampilkan oleh kueri. GQL tidak memiliki operator OR
. Namun, metode ini memiliki operator IN
, yang menyediakan
bentuk OR
terbatas.
Operator IN
membandingkan nilai properti dengan setiap item dalam daftar. Operator IN
setara dengan banyak kueri =
,
satu untuk setiap nilai, yang digabungkan dengan OR. Entity yang nilainya untuk properti tertentu sama dengan salah satu nilai dalam daftar dapat ditampilkan untuk kueri.
Catatan: Operator IN
dan !=
menggunakan beberapa kueri di balik layar. Misalnya, operator IN
mengeksekusi kueri datastore dasar secara terpisah untuk setiap item dalam daftar. Entity yang ditampilkan adalah hasil silang dari semua
kueri datastore yang mendasarinya dan dihapus duplikatnya. Maksimum 30 kueri datastore diizinkan untuk setiap kueri GQL.
Suatu kondisi juga dapat menguji apakah suatu entity memiliki entity tertentu sebagai ancestor, menggunakan operator ANCESTOR IS
. Nilainya adalah instance model atau kunci untuk entity ancestor. Untuk informasi selengkapnya tentang ancestor, lihat Kunci dan Grup Entity.
Sisi kiri perbandingan selalu berupa nama properti. Nama properti standar terdiri dari karakter alfanumerik yang secara opsional dicampur dengan garis bawah dan titik. Dengan kata lain, nilai tersebut cocok dengan ekspresi reguler
[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*
.
Perhatian: Nama properti
yang berisi karakter lain yang dapat dicetak harus diberi tanda kutip dengan tanda kutip ganda. Contoh: "first-name"
. Spasi atau karakter yang tidak dapat dicetak dalam
nama properti tidak didukung.
Sisi kanan perbandingan dapat berupa salah satu dari berikut ini (sesuai dengan jenis data properti):
- literal
str
, sebagai string dengan tanda kutip tunggal. Karakter tanda kutip tunggal dalam string harus di-escape sebagai''
. Contoh:'Joe''s Diner'
- bilangan bulat atau literal angka floating point. Contoh:
42.7
- literal Boolean, seperti
TRUE
atauFALSE
. - literal
NULL
, yang mewakili nilai null (None
di Python). - tanggal, waktu, atau literal waktu, dengan nilai numerik atau representasi
string, dalam bentuk berikut:
DATETIME(year, month, day, hour, minute, second)
DATETIME('YYYY-MM-DD HH:MM:SS')
DATE(year, month, day)
DATE('YYYY-MM-DD')
TIME(hour, minute, second)
TIME('HH:MM:SS')
- literal kunci entity, dengan kunci yang dienkode ke string atau jalur lengkap dari berbagai jenis dan nama/ID kunci:
KEY('encoded key')
KEY('kind', 'name'/ID [, 'kind', 'name'/ID...])
- literal objek Pengguna, dengan alamat email pengguna:
USER('email-address')
- literal GeoPt, dengan lintang dan bujur sebagai nilai floating point:
GEOPT(lat, long)
- nilai parameter terikat. Dalam string kueri, parameter posisi direferensikan oleh angka:
title = :1
. Parameter kata kunci direferensikan berdasarkan nama:title = :mytitle
Catatan: kondisi bentuk property = NULL
periksa apakah nilai null disimpan secara eksplisit dalam datastore untuk properti tersebut atau tidak.
Hal ini berbeda dengan memeriksa apakah entity tidak memiliki nilai untuk properti!
Kueri Datastore yang merujuk ke properti tidak pernah menampilkan entity yang tidak memiliki nilai untuk properti tersebut.
Parameter terikat dapat diikat sebagai argumen posisi atau argumen kata kunci yang diteruskan ke konstruktor GqlQuery atau class model metode gql(). Jenis data properti yang tidak memiliki sintaksis literal nilai yang sesuai harus ditentukan menggunakan binding parameter, termasuk jenis data daftar. Binding parameter dapat diikat kembali dengan nilai baru selama masa aktif instance GqlQuery (misalnya untuk menggunakan kembali kueri secara efisien) menggunakan metode bind() tersebut.
Klausa ORDER BY
opsional menunjukkan bahwa hasil harus ditampilkan berdasarkan properti yang ditentukan, dalam urutan menaik (ASC
) atau menurun (DESC
). Klausa ORDER BY
dapat
menentukan beberapa tata urutan sebagai daftar yang dipisahkan koma, yang dievaluasi dari kiri ke
kanan. Jika arah tidak ditentukan, nilai defaultnya adalah ASC
. Jika tidak ada klausa ORDER BY
yang ditentukan, urutan hasilnya tidak akan ditentukan dan dapat berubah dari waktu ke waktu.
Klausa LIMIT
opsional menyebabkan kueri berhenti menampilkan hasil setelah entity <count>
pertama. Klausa
LIMIT
juga dapat menyertakan <offset>
, untuk
melewati banyak hasil tersebut guna menemukan hasil pertama yang akan ditampilkan. Klausa
OFFSET
opsional dapat menentukan <offset>
, jika tidak ada
klausa LIMIT
.
Catatan: Seperti parameter offset
untuk metode fetch(), OFFSET
dalam string kueri GQL tidak akan mengurangi jumlah
entity yang diambil dari datastore. Hal ini hanya memengaruhi hasil mana yang
ditampilkan oleh metode fetch(). Kueri dengan offset memiliki karakteristik performa yang sesuai secara linear dengan ukuran offset ditambah ukuran batas.
Untuk mengetahui informasi tentang cara menjalankan kueri GQL, parameter binding, dan mengakses hasil, baca class GqlQuery, dan metode class Model.gql().
Contoh
from google.appengine.ext import db class Person(db.Model): name = db.StringProperty() age = db.IntegerProperty() # We use a unique username for the Entity's key. amy = Person(key_name='amym', name='Amy', age=48) amy.put() Person(key_name='bettyd', name='Betty', age=42).put() Person(key_name='charliec', name='Charlie', age=32).put() Person(key_name='charliek', name='Charlie', age=29).put() Person(key_name='eedna', name='Edna', age=20).put() Person(key_name='fredm', name='Fred', age=16, parent=amy).put() Person(key_name='georgemichael', name='George').put()
Untuk menemukan semua entity dari jenis Person
yang usianya
antara 18 dan 35 tahun (yaitu Charlies dan Edna), gunakan kueri ini:
SELECT * FROM Person WHERE age >= 18 AND age <= 35
Untuk menemukan tiga entity dari jenis Person
yang usianya paling tinggi (yaitu Amy, Betty, dan Charlie), gunakan kueri ini:
SELECT * FROM Person ORDER BY age DESC LIMIT 3
Untuk menemukan entity jenis Person
yang namanya adalah salah satu dari "Betty" atau "Charlie", gunakan kueri ini:
SELECT * FROM Person WHERE name IN ('Betty', 'Charlie')
Untuk menampilkan hanya nilai name
bagi setiap Person
, gunakan
kueri ini:
SELECT name FROM Person
Untuk menampilkan nilai name
saja bagi setiap Person
, yang diurutkan berdasarkan age
, gunakan kueri ini:
SELECT name FROM Person ORDER BY age
Untuk menemukan kunci entity dari jenis Person
yang memiliki
usia None
(yaitu KEY('Person', 'georgemichael')
), gunakan kueri
ini:
SELECT __key__ FROM Person WHERE age = NULL
Untuk menemukan semua entity, terlepas dari jenisnya, yang ada dalam grup entity Amy (yaitu Amy dan Fred), gunakan kueri ini:
SELECT * WHERE __key__ HAS ANCESTOR KEY(Person, 'Amy')
Untuk mencocokkan berdasarkan Kunci, kita dapat menggunakan __key__
di sisi kiri kondisi.
Misalnya, kita dapat menggunakan ini untuk mendapatkan semua entity Person
yang memiliki
nama pengguna yang dimulai dengan "a".
SELECT * FROM Person WHERE __key__ >= KEY('Person', 'a') AND __key__ < KEY('Person', 'b')
Catatan: Jika Anda pernah membuat kueri dengan kesetaraan di
__key__
, sebaiknya gunakan get()
untuk mengambil
entity secara langsung.