NOTE: this SDK only works with kwil-db v0.3.0 and before. It's not under active development.
Borrows heavily from web3.py
Kwil is a blockchain-based database platform, while keep being blockchain agnostic on Account. To use Kwil.py, you need to do the following:
- Create a Ethereum account
- Fund the account with some required TOKEN of your kwil provider
- Create database schema, through Kwil Kuneiform IDE. From there, you can get compiled schema bytes.
- Deploy the database schema to the blockchain.
- Create/Update data through predefined Actions.
pip install kwil
Supported python version:
- 3.9
- 3.10
Providers are used to interact with the blockchain. They are responsible for sending and receiving RPC requests. There are following builtin providers:
- GRPCProvider - connects to a remote gRPC based server
Kwil now support Ethereum private key to sign transaction. This key is also associated with an Ethereum account which needed to be funded to use Kwil.
There are examples that shows how to use these API.
Kwil.generate_dbi(owner_addr, dataset_name)
Kwil.load_wallet(private_key)
kwil.deploy_database(payload)
- deploys a new database, payload is compiled bytes of schemakwil.get_schema(db_identifier)
- returns the database schemakwil.list_databases(OPTIONAL[owner_address])
- returns the list of databases under current accountkwil.drop_database(dataset_name)
- drops the database under current accountkwil.execute_action(db_identifier, action_name, inputs)
- executes the action on the database (inputs is a list of dict, where key is the argument name)kwil.call_action(db_identifier, action_name, inputs)
- calls the action on the database (inputs is a dict, where key is the argument name)kwil.query(db_identifier, query)
- executes query(ad-hoc SQL) on the database
Kwil.kwild.ping()
Kwil.kwild.get_config()
- returns the configuration of the nodeKwil.kwild.get_schema(DBIdentifier)
- returns the dataset schema infoKwil.kwild.get_account(Adddress)
- returns the account info(nonce, balance, etc)Kwil.kwild.estimate_price(TxParams)
- returns the estimated price for the transactionKwil.kwild.query(DBIdentifier, Query)
- returns the query(ad-hoc SQL) resultKwil.kwild.list_databases()
- returns the list of databases under current account
Kwil.kwild.broadcast(TxParams)
- broadcasts the transaction to the network
There are more examples in examples folder.
Kwil.py will connect to a Kwil node through a provider. Currently, only GRPC provider is supported.
>>> from kwil import Kwil
>>> kwil = Kwil(Kwil.GRPCProvider("localhost:50051"),
Kwil.load_wallet("YOUR_ETH_PRIVATE_KEY"))
>>> kwil.is_connected()
True
Assume we have our schema defined and compiled(./test_db.json
). We can deploy the schema to the blockchain.
First, create a provider using Kwil.GRPCProvider
.
Then, create a Kwil
instance, can call deploy_database
to deploy the schema to the blockchain.
Finally, call list_database
to list all the databases under current account to verify it's there.
import logging
from kwil import Kwil
# assume that account has enough fund
# here we use examples/testdb.kf as our dataset schema, we'll use examples/testdb.json(compiled schema)
# create client
client = Kwil(Kwil.GRPCProvider("localhost:50051"),
Kwil.load_wallet("YOUR_ETH_PRIVATE_KEY"))
# create dataset
with open("./testdb.json", "r") as f:
schema_json = f.read()
try:
client.deploy_database(schema_json.encode("utf-8"))
except Exception as e:
logging.exception(e)
# list dataset
dbs = client.list_databases()
print("datasets after create: ", dbs)
# execute an action
db_id = Kwil.generate_dbi(client.wallet.address, db_name)
action = "create_user"
tx_receipt = client.execute_action(db_id,
action,
# `create_user` is defined in examples/test_db.kf
[{"$id": 1, "$username": "aha", "$age": 18}])
result = tx_receipt["result"]
print("create user result: ", result)
# call a view action
action = "view_user_info"
tx_receipt = client.call_action(db_id, action, {})
print("user info:", tx_receipt)
Let's extend the example above. We can call execute_action
to execute an action on the database.
In our schema(examples/test_db.kf), we have
action create_user($id, $username, $age) public {
INSERT INTO users (id, username, age, wallet)
VALUES ($id, $username, $age, @caller);
}
create_user
is a public action, so we can call it from outside.
To call this action, we need to provide the dataset identifier, action name and inputs.
tx_receipt = client.execute_action(db_id,
action,
[{"$id": 1, "$username": "aha", "$age": 18}])
Here, we only create one user, the inputs is just a dict of the input parameters with values.
MIT