表の操作
TiDBは、関連するデータのコレクションを整理して保存するためにテーブルを使用します。柔軟なスキーマ定義機能を備えているため、特定の要件に合わせてテーブルを設計できます。
テーブルには、異なるデータ型の複数の列を含めることができます。サポートされているデータ型には、テキスト、数値、ベクター、バイナリデータ( BLOB )、JSONなどがあります。
このドキュメントでは、 pytidbを使用してテーブルを操作する方法を説明します。
pytidbは、開発者が AI アプリケーションを効率的に構築できるように設計されています。
注記:
完全な動作例については、リポジトリの基本的な例参照してください。
テーブルを作成する
TableModelの使用
pytidb 、テーブルのスキーマを表すTableModelクラスを提供します。このクラスはピダンティックモデルと互換性があり、宣言的にテーブルを定義できます。
次の例では、次の列を持つitemsという名前のテーブルを作成します。
id: 整数型の主キー列content: テキスト型の列embedding: 3次元のベクトル型列meta: JSON型の列
データベースに接続するを使用してpytidbインスタンスを取得したら、 clientメソッドをcreate_tableしてテーブルを作成できます。
from pytidb.schema import TableModel, Field, VectorField
from pytidb.datatype import TEXT, JSON
class Item(TableModel):
__tablename__ = "items"
id: int = Field(primary_key=True)
content: str = Field(sa_type=TEXT)
embedding: list[float] = VectorField(dimensions=3)
meta: dict = Field(sa_type=JSON, default_factory=dict)
table = client.create_table(schema=Item, if_exists="overwrite")
create_tableメソッドは次のパラメータを受け入れます。
schema: テーブル構造を定義するTableModelのクラス。if_exists: テーブル作成モード。raise(デフォルト): テーブルが存在しない場合は作成し、既に存在する場合はエラーを発生させます。skip: テーブルが存在しない場合は作成し、既に存在する場合は何も行いません。overwrite: 既存のテーブルを削除し、新しいテーブルを作成します。これはテストや開発には便利ですが、本番環境では推奨されません。
テーブルが作成されると、 tableオブジェクトを使用してデータの挿入、更新、削除、クエリを実行できます。
CREATE TABLEステートメントを使用してテーブルを作成します。
CREATE TABLE items (
id INT PRIMARY KEY,
content TEXT,
embedding VECTOR(3),
meta JSON
);
テーブルにデータを追加する
TableModelを使用
TableModelインスタンスを使用して行を表し、それをテーブルに挿入できます。
単一のレコードを挿入するには:
table.insert()メソッドを使用して、テーブルに 1 つのレコードを挿入します。
table.insert(
Item(
id=1,
content="TiDB is a distributed SQL database",
embedding=[0.1, 0.2, 0.3],
meta={"category": "database"},
)
)
INSERT INTOステートメントを使用して、テーブルに 1 つのレコードを挿入します。
INSERT INTO items(id, content, embedding, meta)
VALUES (1, 'TiDB is a distributed SQL database', '[0.1, 0.2, 0.3]', '{"category": "database"}');
複数のレコードを挿入するには:
table.bulk_insert()メソッドを使用して、テーブルに複数のレコードを挿入します。
table.bulk_insert([
Item(
id=2,
content="GPT-4 is a large language model",
embedding=[0.4, 0.5, 0.6],
meta={"category": "llm"},
),
Item(
id=3,
content="LlamaIndex is a Python library for building AI-powered applications",
embedding=[0.7, 0.8, 0.9],
meta={"category": "rag"},
),
])
INSERT INTOステートメントを使用して、複数のレコードをテーブルに挿入します。
INSERT INTO items(id, content, embedding, meta)
VALUES
(2, 'GPT-4 is a large language model', '[0.4, 0.5, 0.6]', '{"category": "llm"}'),
(3, 'LlamaIndex is a Python library for building AI-powered applications', '[0.7, 0.8, 0.9]', '{"category": "rag"}');
ディクト付き
dict使って行を表し、それをテーブルに挿入することもできます。この方法はより柔軟で、データを挿入するためにTableModel使用する必要がありません。
単一のレコードを挿入するには:
辞書と共にtable.insert()メソッドを使用して、テーブルに 1 つのレコードを挿入します。
table.insert({
"id": 1,
"content": "TiDB is a distributed SQL database",
"embedding": [0.1, 0.2, 0.3],
"meta": {"category": "database"},
})
INSERT INTOステートメントを使用して、テーブルに 1 つのレコードを挿入します。
INSERT INTO items(id, content, embedding, meta)
VALUES (1, 'TiDB is a distributed SQL database', '[0.1, 0.2, 0.3]', '{"category": "database"}');
データをテーブルに保存する
saveメソッドは、単一の行を挿入または更新する便利な方法を提供します。行の場合、主キーがテーブルに存在しない場合、このメソッドは新しい行としてテーブルに挿入します。レコードが既に存在する場合、このメソッドは行全体を上書きします。
注記:
テーブル内にレコードIDが既に存在する場合、
table.save()レコード全体を上書きします。レコードの一部のみを変更するには、table.update()使用します。
table.save()メソッドを使用して、単一のレコードをテーブルに保存します。
例: 新しいレコードを保存する
saved_record = table.save(
Item(
id=4,
content="Vector databases enable AI applications",
embedding=[1.0, 1.1, 1.2],
meta={"category": "vector-db"},
)
)
例: 既存のレコードを保存する (レコード全体を上書きする)
# This overwrites the entire record with id=1
updated_record = table.save(
Item(
id=1, # Existing ID
content="Updated content for TiDB",
embedding=[0.2, 0.3, 0.4],
meta={"category": "updated"},
)
)
レコードを保存するには、 INSERT ... ON DUPLICATE KEY UPDATEステートメントを使用します。
例: 新しいレコードを保存するか、存在する場合は更新する
INSERT INTO items(id, content, embedding, meta)
VALUES (4, 'Vector databases enable AI applications', '[1.0, 1.1, 1.2]', '{"category": "vector-db"}')
ON DUPLICATE KEY UPDATE
content = VALUES(content),
embedding = VALUES(embedding),
meta = VALUES(meta);
テーブルからデータをクエリする
テーブルからレコードを取得するには:
テーブルからレコードを取得するには、 table.query()メソッドを使用します。
例: 最初の10件のレコードを取得する
result = table.query(limit=10).to_list()
SELECTステートメントを使用して、テーブルからレコードを取得します。
例: 最初の10件のレコードを取得する
SELECT * FROM items LIMIT 10;
クエリ条件に基づいてレコードを取得するには:
filtersパラメータをtable.query()メソッドに渡します。
result = table.query(
filters={"meta.category": "database"},
limit=10
).to_list()
レコードをフィルタリングするには、 WHERE句を使用します。
例: カテゴリ「データベース」のレコードを10件取得する
SELECT * FROM items WHERE meta->>'$.category' = 'database' LIMIT 10;
サポートされているフィルター操作と例の完全なリストについては、ガイドフィルタリングを参照してください。
テーブル内のデータを更新する
table.update()メソッドを使用して、レコードをフィルターで更新します。
例: idが1のレコードを更新する
table.update(
values={
"content": "TiDB Cloud Starter is a fully managed, auto-scaling cloud database service",
"embedding": [0.1, 0.2, 0.4],
"meta": {"category": "dbaas"},
},
filters={
"id": 1
},
)
UPDATEステートメントを使用して、レコードをフィルターで更新します。
例: idが1のレコードを更新する
UPDATE items
SET
content = 'TiDB Cloud Starter is a fully managed, auto-scaling cloud database service',
embedding = '[0.1, 0.2, 0.4]',
meta = '{"category": "dbaas"}'
WHERE
id = 1;
テーブルから削除する
テーブルを切り捨てる
テーブルからすべてのデータを削除しながらテーブル構造を維持するには、 table.truncate()メソッドを使用します。
table.truncate()
テーブルが切り捨てられていることを確認するには、テーブルに 0 行が含まれていることを確認します。
table.rows()
テーブルからすべてのデータを削除しながらテーブル構造を維持するには、 TRUNCATE TABLEステートメントを使用します。
TRUNCATE TABLE items;
テーブルが切り捨てられていることを確認するには、テーブルに 0 行が含まれていることを確認します。
SELECT COUNT(*) FROM items;
テーブルを削除する
データベースからテーブルを完全に削除するには、 client.drop_table()メソッドを使用します。
client.drop_table("items")
テーブルがデータベースから削除されたことを確認するには:
client.table_names()
データベースからテーブルを完全に削除するには、 DROP TABLEステートメントを使用します。
DROP TABLE items;
テーブルがデータベースから削除されたことを確認するには:
SHOW TABLES;