Python字符串到varchar的Map不支持使用ODBC和Apache Apache Apache Apache

z9smfwbn  于 2023-10-21  发布在  Python
关注(0)|答案(2)|浏览(106)

我的示例(2.7.5)已经启动并工作了,我可以用DBeaver连接到它并创建表,存储和检索数据等。
我现在尝试使用pyodbc从Python 3(Python 3.6.8)脚本连接。我已经从${IGNITE_HOME}/platforms/cpp目录中提供的源代码编译并安装了ApachePinterite ODBC驱动程序。该脚本能够创建一个表,其中包含2列,一个int和一个varchar,但是当我尝试将字符串值插入varchar列时,会抛出异常:

Traceback (most recent call last):
      File "/path/Projects/test_ignite/main.py", line 27, in <module>
        main()
      File "/path/Projects/test_ignite/main.py", line 23, in main
        create_table(conn)
      File "/path/Projects/test_ignite/main.py", line 16, in create_table
        cursor.execute(sql, (row_counter, col_1))
    pyodbc.Error: ('HYC00', '[HYC00] Data type is not supported. [typeId=-9] (0) (SQLBindParameter)')

更改第二列上的数据类型将按预期工作。
示例脚本如下:

import pyodbc

def create_table(conn):
    sql = 'CREATE TABLE IF NOT EXISTS sample (key int, col_1 varchar, PRIMARY KEY(key))'
    cursor = conn.cursor()
    cursor.execute(sql)

    sql = 'insert into sample (key, col_1) values (?, ?)'
    num_rows = 10
    row_counter = 0

    while row_counter < num_rows:
        row_counter = row_counter + 1
        col_1 = 'Foo'
        cursor.execute(sql, (row_counter, col_1))    # Exception thrown here

def main():
    conn = pyodbc.connect('DRIVER={Apache Ignite};' +
                          'SERVER=10.0.1.48;' +
                          'PORT=10800;')
    create_table(conn)

if __name__ == '__main__':
    main()
wztqucjr

wztqucjr1#

PyODBC似乎使用WVARCHAR类型。但ODBC似乎不支持它。我建议使用jdbc绑定或Python瘦客户端。
我已经提交了一个针对Apache Apache JIRA的问题:IGNITE-12175

vatpfxk5

vatpfxk52#

是的,ignite的odbc驱动程序不支持这种类型(WVARCHAR),但这个问题可以通过这种方式轻松缓解:

with pyodbc.connect('DRIVER={Apache Ignite};SERVER=127.0.0.1;PORT=10800;SCHEMA=PUBLIC') as conn:
    conn.setencoding(encoding='utf-8')
    conn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
    conn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')

相关问题