源自官方提供提供文档,侵删。
8s和8t架构相同,方法相同,以下方法我并没有实测过,谨慎使用。
目录
windows平台python链接GBase8t数据库
环境:
1)、安装GBase8t CSDK.
2)、配置ODBC
3)、安装python3.5 windows版
示例代码:
E:\share>python
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AM
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyodbc
>>> cnxn = pyodbc.connect('DSN=gbaseserver2');
>>> cur = cnxn.cursor();
>>> cur.execute("select id,name from t");
<pyodbc.Cursor object at 0x0000000000C08D50>
>>> rows = cur.fetchall();
>>> print(rows);
[(1, 'name1'), (2, 'name2'), (3, 'name3')]
>>> print (rows[0].name);
name1
>>>
linux平台python使用pyodbc链接GBase8t
环境:
1)、安装unixODBC;
2)、配置odbc。
3)、安装python2.7
4)、安装pyodbc3.0.6
1)、Linux下GBase的ODBC配置
linux 操作系统下需要安装unixODBC 或iODBC 来使用GBase 8s ODBC 驱动。推荐使用unixODBC 驱动管理器。unixODBC 的安装包一般与GBase 8s ODBC 的安装一同提供。您可以到unixODBC 官方网站下载。
首先进入系统盘目录,例如"/media/RHEL-6.6 Server.x86_64/Packages",安装下面这两个安装包。
(1)unixODBC-2.2.14-1.x86_64.rpm:unixODBC的数据源管理器
(2)unixODBC-devel-2.2.14-1.x86_64.rpm:unixODBC的开发包
安装成功后您可以通过如下命令查看unixODBC 的安装信息:
odbc配置文件
vi /etc/odbcinst.ini
注意:【】内数据库名必须与Description后的数据库名保持一致。
#GBase
[GBase]
Description = ODBC for GBase
Driver = /opt/gbase/lib/cli/iclit09b.so
Setup = /opt/gbase/lib/cli/iclit09b.so
Driver64 = /opt/gbase/lib/cli/iclit09b.so
Setup64 = /opt/gbase/lib/cli/iclit09b.so
FileUsage = 1
vi /etc/odbc.ini
[test]
Driver =/opt/gbase/lib/cli/iclit09b.so
SERVER =gbaseserver2
UID =informix
PWD =informix
DATABASE =db_utf8
PORT =9488
CHARSET =UTF8
在环境变量文件下添加以下参数并执行source命令使其生效。
export LD_LIBRARY_PATH=${INFORMIXDIR}/lib:${INFORMIXDIR}/lib/esql:${INFORMIXDIR}/lib/cli
export ODBCINI=/etc/odbc.ini
到此Linux下GBase ODBC已经配置完成,我们可以通过isql来验证ODBC是否配置成功。
2)、验证GBase ODBC配置
我们通过isql来验证ODBC是否配置成功。如下图。
3)、python链接GBase8t
通过以上这个简单的示例,我们即可通过pyodbc对GBase 8s进行访问和交互。
下面简单列出了pyodbc的常用方法和简单使用。
(1)、python数据查询
所有的SQL语句都用cursor.execute函数运行。如果语句返回行,比如一个查询语句返回的行,你可以通过游标的fetch函数来获取数据,这些函数有(fetchone,fetchall,fetchmany).如果返回空行,fetchone函数将返回None,而fetchall和fetchmany将返回一个空列。
ODBC支持在SQL语句中使用一个问号来作为参数。你可以在SQL语句后面加上值,用来传递给SQL语句中的问号,例如:
cursor.execute("""
select user_id, user_name
from users
where last_logon < ?
and bill_overdue = ?
""", '2001-01-01', 'y')
(2)、数据插入
数据插入,把SQL插入语句传递给cursor的execute函数,可以伴随任何需要的参数。必须调用commit函数,否者你对数据库的所有操作将会失效。当断开连接时,所有悬挂的修改将会被重置。例如:
cursor.execute("insert into products(id, name) values ('pyodbc', 'awesome library')")
cnxn.commit()
cur.execute("insert into t values(5,?)",'测试')
cnxn.commit()
(3)、 数据修改和删除
数据修改和删除也是跟上面的操作一样,把SQL语句传递给execute函数。但是我们常常想知道数据修改和删除时,到底影响了多少条记录,这个时候你可以使用cursor.rowcount的返回值。例如:
cursor.execute("delete from products where id <> ?", 'pyodbc')
print cursor.rowcount, 'products deleted'
cnxn.commit()
(4)、常见问题
(4.1)、中文乱码
通过python对数据库进行中文插入,出现中文乱码问题。
通过设置ODBC的DSN字符集即可解决。
先查看数据库字符集设置情况:
sqlcli> show variables like '%char%';
+--------------------------+------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------+
| character_set_client | utf8 | --客户端字符集
| character_set_connection | utf8 |
| character_set_database | utf8 | --数据库字符集
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 | --服务器字符集
| character_set_system | utf8 |
| character_sets_dir | /opt/GBase/Server/global/charsets/ |
+--------------------------+------------------------------------+
8 rows in set (0.16 sec)
结合数据库字符集情况设置ODBC字符集:
vi /etc/odbc.ini
[test]
Driver = /opt/GBase/ODBC/libgsodbc8.so
SERVER = 192.168.79.11
UID = sysdba
PWD = 1
DATABASE = test
PORT = 5258
CHARSET = UTF8
修改保存后需要重启数据库服务才能生效设置。
python使用informixdb链接GBase8t
环境:
1)、安装python2.7
2)、安装informixdb
informixdb下载地址:http://informixdb.sourceforge.net/
tar –xvf InformixDB-2.5.tar
cd InformixDB-2.5
python setup.py build_ext
python setup.py install
示例代码:
#!/usr/bin/python
import sys
import informixdb # import the InformixDB module
# ------------------------------------
# open connection to database 'stores'
# ------------------------------------
conn = informixdb.connect("stores")
# ----------------------------------
# allocate cursor and execute select
# ----------------------------------
cursor1 = conn.cursor(rowformat = informixdb.ROW_AS_DICT)
cursor1.execute('select code, sname from state')
# --------------------------
# prepare 'delete' statement
# --------------------------
cursor2 = conn.cursor()
# ---------------------
# fetch thru result set
# ---------------------
for row in cursor1:
# -------------------------------------------
# delete row if column 'code' begins with 'C'
# -------------------------------------------
if row['code'][0] == 'C':
cursor2.execute('delete from state where code = ?', (row['code'],))
print "DELETED: %-2s %-15s" % (row['code'], row['sname'])
continue
# --------
# show row
# --------
print "%-2s %-15s" % (row['code'], row['sname'])
# ---------------------------------------
# commit transaction and close connection
# ---------------------------------------
conn.commit()
conn.close()
sys.exit(0);