Python客户端
Ignite 3 客户端通过标准套接字连接接入集群,客户端不是集群拓扑的一部分,不会保存任何数据,也不会参与计算任务的执行。
Ignite DB API 驱动使用 Python 数据库 API。
1.入门
1.1.前提条件
要运行 Python 驱动,需要满足以下条件:
- CMake 3.18 或更高版本来构建驱动程序;
- Python 3.9 或更高版本(测试了 3.9、3.10、3.11 和 3.12);
- 访问正在运行的 Ignite 3 节点。
1.2.限制
当前版本不支持执行 SQL 脚本。
1.3.安装
要安装 Python DB API 驱动,请从 pip 下载:
pip install pyignite_dbapi之后就可以将pyignite_dbapi导入到自己的工程中使用。
2.接入集群
使用connect()方法可以接入集群:
addr = ['127.0.0.1:10800']
return pyignite_dbapi.connect(address=addr, timeout=10)用完之后请记住一定要关闭与集群的连接。
conn.close()或者也可以使用with语句在不再需要时自动关闭连接:
with pyignite_dbapi.connect(address=addr, timeout=10) as conn:
conn.cursor()2.1.配置SSL连接
如果要实现与集群的安全连接,可以通过提供密钥文件和证书来启用 SSL,例如:
def create_ssl_connection():
"""Create SSL-enabled connection to Ignite cluster."""
addr = ['127.0.0.1:10800']
return pyignite_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>'
)提示
证书文件和密钥的所有路径都应以适合系统的字符串格式提供。
2.2.配置认证
如果集群使用基本认证,则需要提供用户的identity和secret并对其进行认证,例如:
def create_authenticated_connection():
"""Create authenticated connection to Ignite cluster."""
addr = ['127.0.0.1:10800']
return pyignite_dbapi.connect(
address=addr,
timeout=10,
identity='user',
secret='password'
)2.3.配置数据访问
可以配置可选属性来微调数据的访问方式。
| 配置名 | 描述 |
|---|---|
schema | 使用的模式名。默认值:PUBLIC。 |
page_size | 单个请求中可以接收或发送的最大行数。默认值:1024 |
以下示例演示了如何设置这些属性:
def create_configured_connection():
"""Create authenticated connection to Ignite cluster."""
addr = ['127.0.0.1:10800']
return conn = pyignite_dbapi.connect(
address=addr,
timeout=10,
schema='CUSTOM',
page_size=2048
)3.获取游标对象
要在 Python 客户端中处理表,需使用从连接对象中获取的cursor对象:
conn.cursor()与连接类似,可以在获取游标时使用with语句:
with conn.cursor() as cursor:4.执行单个查询
游标对象可通过execute命令执行 SQL 语句:
# Create table
cursor.execute('''
CREATE TABLE Person(
id INT PRIMARY KEY,
name VARCHAR,
age INT
)
''')5.执行批处理查询
可以使用executemany命令执行具有一批参数的 SQL 查询,这种操作的性能比执行单个查询高得多。下面的示例将插入 Person 表几行数据:
# 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)6.获取查询结果
游标保留对操作的引用。如果操作返回结果(例如,一个SELECT),它们会存储在游标中。然后可以使用fetchone()方法从游标中拿到查询结果:
# 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]}")7.使用事务
数据库操作所需的事务默认是隐式处理的,但是也可以禁用自动事务处理并手动处理提交。
为此,首先要禁用自动提交:
conn.autocommit = False禁用自动提交后,就需要手动提交事务:
# Insert valid records
cursor.execute('INSERT INTO Person VALUES(?, ?, ?)', [4, "Alice", 29])
cursor.execute('INSERT INTO Person VALUES(?, ?, ?)', [5, "Charlie", 31])
cursor.execute('INSERT INTO Person VALUES(?, ?, ?)', [6, "Invalid", new_age])
conn.commit()
print("Transaction committed successfully")未提交的操作将发送到集群,但不会写入表。仅在调用commit方法时才会更新该表,也可以使用rollback命令回滚所有未提交的操作:
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])
cursor.execute('INSERT INTO Person VALUES(?, ?, ?)', [6, "Invalid", new_age])
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}")提示
rollback命令会回滚所有未提交的数据。
18624049226
