有人可以告訴我如何在 Godot 中的兩個表之間創建外鍵關系。我無法根據當前的檔案進行計算。
extends Node2D
const SQLite = preload("res://addons/godot-sqlite/bin/gdsqlite.gdns")
var save_path = "user://data.sqlite"
var db
func _ready():
db = SQLite.new()
db.path = save_path
db.foreign_keys = true
db.open_db()
db.create_table("dog_names", {
"id": {"data_type": "int", "primary_key": true, "auto_increment": true},
"first_name": {"data_type": "text"},
"last_name": {"data_type": "text"},
})
db.create_table("owners", {
"id": {"data_type": "int", "primary_key": true, "auto_increment": true},
"name": {"data_type": "text"}
})
db.query("SELECT * FROM dog_names;")
print(db.query_result[0]["first_name"])
本質上,我只想在表所有者和表狗之間添加多對一關系。一個主人可以養多只狗,但一只狗只能有一個主人。
謝謝
uj5u.com熱心網友回復:
首先,您需要在打開資料庫之前啟用它們:
db.foreign_keys = true
# …
db.open_db()
然后你需要一個參考另一個表的欄位,并添加一個表單條目"foreign_key": "TABLE_NAME.FIELD_NAME"(data_type必須匹配,參考的欄位必須是"primary_key": trueor "unique": true):
例如:
db.create_table("dog", {
# …
"owner_id": {"data_type": "int", "foreign_key": "owner.id"}
})
這將使你們的關系。在這種情況下,狗零個或一個主人("not_null": true如果你想強制它必須有一個,你可以使用它)。并且owner有零到多只狗。
使用外鍵約束,當您插入或修改dog表的記錄時,該owner_id欄位必須匹配表id上的記錄之一owner(或 be null)。
例如,如果表上的記錄dog是 ,那么表owner_id上123肯定有一條owner記錄id是123。它不會讓您以違反該約束的方式插入或修改該值。
因此,一旦您在資料庫中插入資料,您就知道可以使用owner_id來查詢owner表:
var dog_query_str := "SELECT owner_id FROM dog;"
var owner_query_str := "SELECT name FROM owner WHERE id=?;"
db.query(dog_query_str)
for result in db.query_result:
db.query_with_bindings(owner_query_str, [result["owner_id"]])
print(db.query_result)
請注意,這里我使用的是準備好的陳述句。
或者您可以使用 JOIN:
var query_str := "SELECT name FROM dog JOIN owner ON dog.owner_id = owner.id;"
db.query(query_str)
print(db.query_result)
當然,您可以根據需要對其進行修改。有關 SQLite支持的 SQL 語法,請參見SQLite 對SQL 的理解。
uj5u.com熱心網友回復:
foreign_key那么這是從關系中獲取資訊的最佳/唯一方法嗎?
db.query("SELECT owner FROM dog_names;")
print(db.query_result)
print(db.query_result[0])
var o = db.query_result[0]["owner"]
print(o)
var o_str = "SELECT name FROM owners WHERE id = {int};"
var o_form = o_str.format({"int": o})
db.query(o_form)
print(db.query_result)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/480473.html
