หลังจากอ่านเกี่ยวกับแนวคิด/ทฤษฎีของ Google Datastore ฉันก็เริ่มใช้ แพ็คเกจ Go datastore ก>
สถานการณ์: ประเภท User
และ LinkedAccount
กำหนดให้ผู้ใช้ทุกคนมีบัญชีที่เชื่อมโยงตั้งแต่หนึ่งบัญชีขึ้นไป (ใช่ การเข้าสู่ระบบของบุคคลที่สาม) เพื่อความสอดคล้องที่แข็งแกร่ง LinkedAccounts จะเป็นลูกของผู้ใช้ที่เกี่ยวข้อง การสร้างผู้ใช้ใหม่จะเกี่ยวข้องกับการสร้างทั้งผู้ใช้และบัญชีที่เชื่อมโยง ไม่ใช่เพียงบัญชีเดียว
การสร้างผู้ใช้ดูเหมือนเป็นกรณีการใช้งานที่สมบูรณ์แบบสำหรับการทำธุรกรรม ถ้าบอกว่าการสร้าง LinkedAccount ล้มเหลว ธุรกรรมจะย้อนกลับและล้มเหลว ดูเหมือนจะเป็นไปไม่ได้ในขณะนี้ เป้าหมายคือการสร้างผู้ปกครองและลูกภายในธุรกรรม
ตามเอกสาร
การดำเนินการ Datastore ทั้งหมดในธุรกรรมจะต้องดำเนินการกับเอนทิตีในกลุ่มเอนทิตีเดียวกัน หากธุรกรรมนั้นเป็นธุรกรรมกลุ่มเดียว
เราต้องการให้ User
และ LinkedAccount
ใหม่อยู่ในกลุ่มเดียวกัน ดังนั้นสำหรับฉันดูเหมือนว่า Datastore น่าจะสนับสนุนสถานการณ์นี้ ความกลัวของฉันคือความหมายที่ตั้งใจไว้คือการดำเนินการกับเอนทิตี ที่มีอยู่ ในกลุ่มเดียวกันสามารถดำเนินการได้ในธุรกรรมเดียว
tx, err := datastore.NewTransaction(ctx)
if err != nil {
return err
}
incompleteUserKey := datastore.NewIncompleteKey(ctx, "User", nil)
pendingKey, err := tx.Put(incompleteUserKey, user)
if err != nil {
return err
}
incompleteLinkedAccountKey := datastore.NewIncompleteKey(ctx, "GithubAccount", incompleteUserKey)
// also tried PendingKey as parent, but its a separate struct type
_, err = tx.Put(incompleteLinkedAccountKey, linkedAccount)
if err != nil {
return err
}
// attempt to commit
if _, err := tx.Commit(); err != nil {
return err
}
return nil
จากแหล่งที่มาของไลบรารี เป็นที่ชัดเจนว่าเหตุใดจึงไม่ทำงาน PendingKey
ไม่ใช่คีย์และคีย์ที่ไม่สมบูรณ์ไม่สามารถใช้เป็นพาเรนต์ได้
นี่เป็นข้อจำกัดที่จำเป็นของ Datastore หรือของไลบรารีหรือไม่ สำหรับผู้ที่มีประสบการณ์กับข้อกำหนดประเภทนี้ คุณเพียงแค่สละความสม่ำเสมอที่แข็งแกร่งและทำให้ทั้งสองประเภทเป็นสากลหรือไม่?
สำหรับความสามารถของ Google:
- ที่เก็บข้อมูล: รหัสไม่ถูกต้อง
- ที่เก็บข้อมูล: ไม่สามารถใช้ pendingKey เป็นประเภท *"google.golang.org/cloud/datastore".Key