# Database Operations for hermes Agents **Level**: Beginner **Prerequisites**: Python development experience, AITBC CLI installed **Estimated Time**: 25 minutes **Last Updated**: 2026-05-02 **Version**: 1.0 ## ๐Ÿงญ **Navigation Path:** **๐Ÿ  [Documentation Home](../README.md)** โ†’ **๐ŸŽญ [Agent Scenarios](./README.md)** โ†’ *You are here* **breadcrumb**: Home โ†’ Scenarios โ†’ Database Operations --- ## ๐ŸŽฏ **See Also:** - **๐Ÿ“– Previous Scenario**: [11 IPFS Storage](./11_ipfs_storage.md) - **๐Ÿ“– Next Scenario**: [13 Mining Setup](./13_mining_setup.md) - **๐Ÿค– Agent SDK**: [Agent SDK Documentation](../agent-sdk/README.md) - **๐Ÿ—„๏ธ Database**: [Database Documentation](../apps/coordinator-api/src/app/database.py) --- ## ๐Ÿ“š **Scenario Overview** This scenario demonstrates how hermes agents host and manage databases on the AITBC network for persistent data storage and retrieval. ### **Use Case** An hermes agent needs database hosting to: - Store agent state and configuration - Persist transaction history - Cache computation results - Enable data persistence across restarts - Provide data services to other agents ### **What You'll Learn** - Create database instances - Configure database connections - Execute database queries - Manage database schemas - Handle database migrations ### **Features Combined** - **Python Development**: Database service implementation - **Data Persistence**: SQL operations and schema management - **Service Hosting**: Database service deployment --- ## ๐Ÿ“‹ **Prerequisites** ### **Knowledge Required** - Python 3.13+ development - SQL basics - Database concepts ### **Tools Required** - AITBC CLI installed - Python 3.13+ - PostgreSQL or SQLite - Wallet for database operations ### **Setup Required** - Database service running - Coordinator API accessible - Wallet configured --- ## ๐Ÿ”ง **Step-by-Step Workflow** ### **Step 1: Create Database Instance** Initialize a new database for your agent. ```bash aitbc database create \ --wallet my-agent-wallet \ --name agent-db \ --type postgresql \ --size 10 ``` Output: ``` Database created: agent-db Database ID: db_abc123... Type: postgresql Size: 10 GB Connection String: postgresql://user:pass@host:5432/agent-db ``` ### **Step 2: Create Table Schema** Define tables for your data. ```bash aitbc database schema \ --database-id db_abc123... \ --schema schema.sql ``` schema.sql: ```sql CREATE TABLE transactions ( id SERIAL PRIMARY KEY, tx_hash VARCHAR(64) UNIQUE, from_address VARCHAR(64), to_address VARCHAR(64), amount DECIMAL, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE agent_state ( id SERIAL PRIMARY KEY, key VARCHAR(255) UNIQUE, value TEXT, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` ### **Step 3: Execute Query** Run SQL queries on the database. ```bash aitbc database query \ --database-id db_abc123... \ --query "SELECT * FROM transactions LIMIT 10" ``` ### **Step 4: List Databases** View all databases owned by your wallet. ```bash aitbc database list --wallet my-agent-wallet ``` ### **Step 5: Backup Database** Create a backup of your database. ```bash aitbc database backup \ --database-id db_abc123... \ --output backup.sql ``` --- ## ๐Ÿ’ป **Code Examples Using Agent SDK** ### **Example 1: Create and Use Database** ```python from aitbc_agent_sdk import Agent, AgentConfig config = AgentConfig( name="database-agent", blockchain_network="mainnet", wallet_name="database-wallet" ) agent = Agent(config) agent.start() # Create database db = agent.create_database( name="agent-db", db_type="postgresql", size_gb=10 ) print(f"Database created: {db['database_id']}") # Execute query result = agent.execute_query( database_id=db['database_id'], query="SELECT COUNT(*) FROM transactions" ) print(f"Transaction count: {result[0]['count']}") ``` ### **Example 2: Persistent Agent State** ```python from aitbc_agent_sdk import Agent, AgentConfig import asyncio import json async def persistent_state_agent(): config = AgentConfig( name="stateful-agent", blockchain_network="mainnet", wallet_name="stateful-wallet" ) agent = Agent(config) await agent.start() # Get or create database db = await agent.get_or_create_database("agent-state-db") # Initialize schema if needed await agent.execute_query( database_id=db['database_id'], query=""" CREATE TABLE IF NOT EXISTS agent_state ( key VARCHAR(255) PRIMARY KEY, value TEXT, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) """ ) # Save agent state state = { "last_processed_block": 12345, "total_transactions": 1000, "earnings": 500.0 } await agent.execute_query( database_id=db['database_id'], query="INSERT INTO agent_state (key, value) VALUES (?, ?) ON CONFLICT (key) DO UPDATE SET value = ?, updated_at = CURRENT_TIMESTAMP", params=["agent_state", json.dumps(state), json.dumps(state)] ) # Load agent state result = await agent.execute_query( database_id=db['database_id'], query="SELECT value FROM agent_state WHERE key = ?", params=["agent_state"] ) if result: loaded_state = json.loads(result[0]['value']) print(f"Loaded state: {loaded_state}") asyncio.run(persistent_state_agent()) ``` ### **Example 3: Transaction History Database** ```python from aitbc_agent_sdk import Agent, AgentConfig import asyncio class TransactionDatabase: def __init__(self, config): self.agent = Agent(config) self.db_id = None async def start(self): await self.agent.start() # Create database db = await self.agent.create_database( name="transaction-history", db_type="postgresql", size_gb=20 ) self.db_id = db['database_id'] # Create schema await self.agent.execute_query( database_id=self.db_id, query=""" CREATE TABLE IF NOT EXISTS transactions ( id SERIAL PRIMARY KEY, tx_hash VARCHAR(64) UNIQUE, from_address VARCHAR(64), to_address VARCHAR(64), amount DECIMAL, fee DECIMAL, block_height INTEGER, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX (tx_hash), INDEX (from_address), INDEX (to_address) ) """ ) async def store_transaction(self, tx_data): """Store a transaction in the database""" await self.agent.execute_query( database_id=self.db_id, query=""" INSERT INTO transactions (tx_hash, from_address, to_address, amount, fee, block_height) VALUES (?, ?, ?, ?, ?, ?) """, params=[ tx_data['hash'], tx_data['from'], tx_data['to'], tx_data['amount'], tx_data['fee'], tx_data['block_height'] ] ) async def get_transaction_history(self, address, limit=100): """Get transaction history for an address""" result = await self.agent.execute_query( database_id=self.db_id, query=""" SELECT * FROM transactions WHERE from_address = ? OR to_address = ? ORDER BY timestamp DESC LIMIT ? """, params=[address, address, limit] ) return result async def get_balance_history(self, address): """Calculate balance history for an address""" result = await self.agent.execute_query( database_id=self.db_id, query=""" SELECT timestamp, SUM(CASE WHEN from_address = ? THEN -amount ELSE 0 END) as sent, SUM(CASE WHEN to_address = ? THEN amount ELSE 0 END) as received FROM transactions WHERE from_address = ? OR to_address = ? GROUP BY timestamp ORDER BY timestamp """, params=[address, address, address, address] ) return result async def main(): config = AgentConfig( name="tx-db-agent", blockchain_network="mainnet", wallet_name="tx-db-wallet" ) tx_db = TransactionDatabase(config) await tx_db.start() # Store a transaction await tx_db.store_transaction({ "hash": "0xabc123...", "from": "ait1sender...", "to": "ait1recipient...", "amount": 100, "fee": 1, "block_height": 12345 }) # Get history history = await tx_db.get_transaction_history("ait1sender...") print(f"Transaction history: {len(history)} transactions") asyncio.run(main()) ``` --- ## ๐ŸŽฏ **Expected Outcomes** After completing this scenario, you should be able to: - Create database instances - Define database schemas - Execute SQL queries - Persist agent state - Manage database backups --- ## ๐Ÿงช **Validation** Validate this scenario with the shared 3-node harness: ```bash bash scripts/workflow/44_comprehensive_multi_node_scenario.sh ``` **Node coverage**: - `aitbc1`: genesis / primary node checks - `aitbc`: follower / local node checks - `gitea-runner`: automation / CI node checks **Validation guide**: - [Scenario Validation Guide](./VALIDATION.md) **Expected result**: - Scenario-specific commands complete successfully - Cross-node health checks pass - Blockchain heights remain in sync - Any node-specific step is documented in the scenario workflow --- ## ๐Ÿ”— **Related Resources** ### **AITBC Documentation** - [Database Service](../apps/coordinator-api/src/app/database.py) - [PostgreSQL Adapter](../apps/wallet/src/app/ledger_mock/postgresql_adapter.py) - [SQLite Adapter](../apps/wallet/src/app/ledger_mock/sqlite_adapter.py) ### **External Resources** - [PostgreSQL Documentation](https://www.postgresql.org/docs/) - [SQL Basics](https://www.w3schools.com/sql/) ### **Next Scenarios** - [30 Database Service Agent](./30_database_service_agent.md) - Advanced database workflows - [36 Autonomous Compute Provider](./36_autonomous_compute_provider.md) - Database for compute providers - [39 Federated Learning Coordinator](./39_federated_learning_coordinator.md) - Database for federated learning --- ## ๐Ÿ“Š **Quality Metrics** - **Structure**: 10/10 - Clear database operations workflow - **Content**: 10/10 - Comprehensive database operations - **Code Examples**: 10/10 - Working Agent SDK examples - **Status**: Active scenario --- *Last updated: 2026-05-02* *Version: 1.0* *Status: Active scenario document*