- İlişkisel Veritabanları
- Temel SQL Sorguları Yazma
- Knex.js kullanarak Temel Sorgular Yazma
- Projeyi froklayın, clonelayın ve sıkça pushlayın.
Chrome'u kullanarak W3Schools.com'da SQL Try Editor'ı ziyaret edin ve aşağıdaki sorguları oluşturun. Çalıştıktan sonra, projenin kök dizinindeki queries.sql
dosyasına kopyalayın.
- Posta kodu 1010 olan tüm müşterileri bulun. 3 kayıt döndürür.
- id'si 11 olan tedarikçinin telefon numarasını bulun. (010) 9984510 olmalıdır.
- Verilen ilk 10 siparişi, sipariş tarihine göre azalan şekilde sıralayın. 1997-02-12 tarihli sipariş en üstte olmalıdır.
- Londra, Madrid veya Brezilya'da yaşayan tüm müşterileri bulun. 18 kayıt döndürür.
- "The Shire" için bir müşteri kaydı ekleyin, ilgili kişi adı "Bilbo Baggins", adres "Bag End" içinde "1 Hobbit-Hole", posta kodu "111" ve ülke "Orta Dünya".
- Bilbo Baggins kaydını, posta kodu "11122" olacak şekilde güncelleyin.
Sayfadaki 'Veritabanını Geri Yükle' düğmesini tıklayınca veritabanını orijinal verilerle yeniden dolduracak ve yaptığınız tüm değişiklikleri iptal edecektir.
budget.db3
veritabanının "accounts" tablosunda bazı kayıtlar sağladık. Aşağıdaki komutu çalıştırarak veritabanını (veritabanını sildikten sonra bile) geri yükleyebilirsiniz:
npm run resetdb
field | data type | metadata |
---|---|---|
id | unsigned integer | primary key, auto-increments, generated by database |
name | string | required, unique |
budget | numeric | required |
-
Aşağıdaki db erişim fonksiyonlarını Knex kullanarak
api/accounts/accounts-model.js
içine yazın:getAll
, bir hesap dizisini (veya boş bir diziyi) dönergetById
verilen kimliğe göre bir hesabı dönercreate
, yeni oluşturulan hesabı! dönerupdateById
, güncellenen hesabı! dönerdeleteById
silinen hesabı! döner
-
İşte Knex ile SQLite ile çalışmak için bazı kopyalar :):
db('foo-table') // returns a promise that resolves to an **array** with all records in the table
db('foo-table').where({ role: 'Student', active: true }) // resolves to an **array** of all records that satisfy the where
db('foo-table').where('name', 'Mary') // is an alternative for when there is just one where condition
db('foo-table').where('id', 7).first() // will resolve to the **record** we want (if the id is unique for a table) or undefined
db('foo-table').insert({ bar: 'baz' }) // resolves to an **array** containing the **ids of the records** inserted into the table
db('foo-table').where('id', id).update({ bar: 'new bar' }) // resolves to the **number of records** affected by the update
db('foo-table').where('id', id).delete() // resolves to the **number of records** affected by the delete
db('foo-table') // tablodaki tüm kayıtları **array** olarak içeren bir promise döndürür
db('foo-table').where({ role: 'Student', active: true }) // where'i sorgusunu karşılayan tüm kayıtları bir **array** olarak döner
db('foo-table').where('name', 'Mary') // sadece bir tane where koşulu olduğunda bir alternatiftir
db('foo-table').where('id', 7).first() // istediğimiz **record**u (bir tablo için id unique ise) veya undefined döner
db('foo-table').insert({ bar: 'baz' }) // tabloya eklenen **kayıtların id'lerini** içeren bir **array** döner
db('foo-table').where('id', id).update({ bar: 'new bar' }) // güncelleme ile etkilenen **kayıt sayısını** döner
db('foo-table').where('id', id).delete() // silme işleminden etkilenen **kayıt sayısını** döner
-
api/accounts/accounts-middleware.js
içine aşağıdaki middleware'ları yazın:-
checkAccountPayload
,req.body
geçersizse, 400 durumunu döndürür:- Ad veya bütçe tanımlanmamışsa,
{ message: "name and budget are required" }
döndürün - _trimmed_name 3'ten kısa veya 100'den uzunsa,
{ message: "name of account must be between 3 and 100" }
döndürün - Bütçe bir sayıya dönüştürülemiyorsa,
{ message: "budget of account must be a number" }
döndürün - Bütçe negatif bir sayıysa veya bir milyonun üzerindeyse,
{ message: "budget of account is too large or too small" }
döndürün
- Ad veya bütçe tanımlanmamışsa,
-
checkAccountId
, veritabanındareq.params.id
yoksa{ message: "account not found" }
ile bir durum 404 döndürün -
trimmed
req.body.name
zaten veritabanında mevcutsa,checkAccountNameUnique
,{ message: "that name is taken" }
ile bir durum 400 döndürün
-
-
Uygun olan yerlerde yukarıdaki ara yazılımları ve model işlevlerini kullanarak
accounts
kaynağı için CRUD yazın:[GET] /api/accounts
, hesapları içeren bir array (veya -yoksa- boş bir array) döndürür.[GET] /api/accounts/:id
verilen id'ye göre bir hesap döndürür.[POST] /api/accounts
oluşturulan hesabı döndürür. db'ye kaydetmeden önce bütçename
ndeki baştaki veya sondaki boşluk kesilmelidir.[PUT] /api/accounts/:id
güncellenen hesabı döndürür. db'ye kaydetmeden önce bütçename
ndeki baştaki veya sondaki boşluk kesilmelidir.[DELETE] /api/accounts/:id
silinen hesabı döndürür.
-
Beklendiği gibi çalıştıklarını kontrol etmek için uç noktalarınızı "Insomnia" veya "Postman" gibi bir REST istemcisiyle manuel olarak test edin.
-
npm test
ini çalıştırarak uç noktalarınızı otomatik olarak test edin.
- Ek dosyalar oluşturabilirsiniz ancak mevcut dosyaları veya klasörleri taşımayın veya yeniden adlandırmayın.
package.json
dosyanızı, ek kitaplıklar kurmak veya ek komut dosyaları eklemek dışında değiştirmeyin.- Çözümünüzde en iyi uygulamaları takip etmeniz, temiz ve profesyonel sonuçlar üretmeniz esastır.
- Çalışmanızı gözden geçirmek, iyileştirmek ve değerlendirmek için zamanınızı ayırın.
- Çalışmanızda yazım denetimi ve dilbilgisi denetimi de dahil olmak üzere temel profesyonel yaklaşımları da gerçekleştirin.
Aşağıdaki alıştırmalar araştırma gerektirir, bunları tamamlamak için gereken kavramlar henüz derslerde işlenmedi.
-
Daha fazla sorgu çalıştırın.
- Müşteriler tablosunda kaç farklı şehrin saklandığını keşfetmek için bir sorgu bulun. Tekrarlar çift sayılmamalıdır. 69 olmalı
- 20 karakterden uzun adları olan tüm tedarikçileri bulun. 11 kayıt döndürür.
GET /api/accounts
uç noktasına birquery string
seçeneği ekleyin.query string
,limit
,sortby
vesortdir
anahtarlarını içerebilir. Bu anahtarlar sağlanmışsa, veritabanından seçilen "hesapları" sınırlamak ve sıralamak için bu değerleri kullanın. Sıralama ve sınırlama için knexjs.org içindeki belgelere başvurun.
// örnek req.query nesnesi { limit: 5, sortby: 'id', sortdir: 'desc' }