This is an automated email from the ASF dual-hosted git repository.

isapego pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 4fb2e4ff001 IGNITE-26388 Add python DB API example (#6550)
4fb2e4ff001 is described below

commit 4fb2e4ff001dc8a4d75b70102ad9589b2a59d864
Author: IgGusev <[email protected]>
AuthorDate: Fri Sep 5 12:53:51 2025 +0400

    IGNITE-26388 Add python DB API example (#6550)
---
 examples/python/db_api_example.py | 145 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 145 insertions(+)

diff --git a/examples/python/db_api_example.py 
b/examples/python/db_api_example.py
new file mode 100644
index 00000000000..a19d96226b1
--- /dev/null
+++ b/examples/python/db_api_example.py
@@ -0,0 +1,145 @@
+import pygridgain_dbapi
+from pygridgain_dbapi import DatabaseError
+
+def create_simple_connection():
+  """Create a basic connection to GridGain cluster."""
+  addr = ['127.0.0.1:10800']
+  return pygridgain_dbapi.connect(address=addr, timeout=10)
+
+def create_ssl_connection():
+  """Create SSL-enabled connection to GridGain cluster."""
+  addr = ['127.0.0.1:10800']
+  return pygridgain_dbapi.connect(
+      address=addr,
+      timeout=10,
+      use_ssl=True,
+      ssl_keyfile='<path_to_ssl_keyfile.pem>',
+      ssl_certfile='<path_to_ssl_certfile.pem>',
+      # Optional: ssl_ca_certfile='<path_to_ssl_ca_certfile.pem>'
+  )
+
+def create_authenticated_connection():
+  """Create authenticated connection to GridGain cluster."""
+  addr = ['127.0.0.1:10800']
+  return pygridgain_dbapi.connect(
+      address=addr,
+      timeout=10,
+      identity='user',
+      secret='password'
+  )
+
+def basic_operations_example():
+  """Demonstrate basic CRUD operations."""
+  with create_simple_connection() as conn:
+    with conn.cursor() as cursor:
+      try:
+        # Drop table if exists (for clean runs)
+        cursor.execute('DROP TABLE IF EXISTS Person')
+
+        # Create table
+        cursor.execute('''
+                  CREATE TABLE Person(
+                      id INT PRIMARY KEY, 
+                      name VARCHAR, 
+                      age INT
+                  )
+              ''')
+
+        # Sample data
+        sample_data = [
+          [1, "John", 30],
+          [2, "Jane", 32],
+          [3, "Bob", 28]
+        ]
+
+        # Insert data (fixed table name)
+        cursor.executemany('INSERT INTO Person VALUES(?, ?, ?)', sample_data)
+
+        # Query data
+        cursor.execute('SELECT * FROM Person ORDER BY id')
+        results = cursor.fetchall()
+
+        print("All persons in database:")
+        for row in results:
+          print(f"ID: {row[0]}, Name: {row[1]}, Age: {row[2]}")
+
+        # Query specific record
+        cursor.execute('SELECT name, age FROM Person WHERE id = ?', [2])
+        person = cursor.fetchone()
+        if person:
+          print(f"\nFound person: {person[0]}, age {person[1]}")
+      except Exception as e:
+        print(f"Database error: {e}")
+
+
+def transaction_example():
+  """Demonstrate transaction handling with proper rollback scenarios."""
+  conn = create_simple_connection()
+
+  try:
+    # Disable autocommit for manual transaction control
+    conn.autocommit = False
+
+    with conn.cursor() as cursor:
+      try:
+        # Insert valid records
+        cursor.execute('INSERT INTO Person VALUES(?, ?, ?)', [4, "Alice", 29])
+        cursor.execute('INSERT INTO Person VALUES(?, ?, ?)', [5, "Charlie", 
31])
+
+        # Simulate a business logic check that fails
+        # (e.g., age validation, duplicate check, etc.)
+        new_age = 150  # Invalid age
+        if new_age > 120:
+          raise ValueError("Age validation failed: unrealistic age")
+
+        cursor.execute('INSERT INTO Person VALUES(?, ?, ?)', [6, "Invalid", 
new_age])
+
+        # If we get here, commit all changes
+        conn.commit()
+        print("Transaction committed successfully")
+
+      except Exception as e:
+        # Rollback on any error
+        conn.rollback()
+        print(f"Transaction rolled back due to error: {e}")
+
+      # Verify what's actually in the database
+      cursor.execute('SELECT COUNT(*) FROM Person')
+      count = cursor.fetchone()[0]
+      print(f"Total persons in database: {count}")
+
+  except Exception as e:
+    print(f"Connection error: {e}")
+  finally:
+    conn.close()
+
+def connection_examples():
+  """Show different connection types."""
+  print("=== Connection Examples ===")
+
+  # Basic connection
+  print("1. Basic connection:")
+  with create_simple_connection() as basic_conn:
+    print(f"   Connected: {basic_conn is not None}")
+
+  # Note: SSL and auth connections would be created similarly
+  # but require actual certificates/credentials to test
+  print("2. SSL and authenticated connections available via helper functions")
+
+def main():
+  """Main function demonstrating GridGain DB API usage."""
+  print("GridGain DB API Example")
+  print("=" * 30)
+
+  try:
+    connection_examples()
+    print("\n=== Basic Operations ===")
+    basic_operations_example()
+    print("\n=== Transaction Handling ===")
+    transaction_example()
+
+  except Exception as e:
+    print(f"Application error: {e}")
+
+if __name__ == "__main__":
+  main()
\ No newline at end of file

Reply via email to