debian下python3读取MDB数据库

linux平台上可以使用unixodbc和libmdbodbc1读取mdb

unixODBC是unix like平台上ODBC规范的开源实现,而libmdbodbc1则是mdbtools提供的mdb数据库的odbc驱动。
如果不通过编程方式,只是单纯查看mdb,可以Debian查看Acess MDB数据库文件

安装

unixODBC和libmdbodbc1

#apt-get install unixodbc libmdbodbc1

配置odbc

/etc/odbcinst.ini配置odbc驱动
[html]
[MDBTools]
Description=MDBTools Driver
Driver=libmdbodbc.so.1
Setup=libmdbodbc.so.1
FileUsage=1
UsageCount=1
[/html]

/etc/odbc.ini配置数据源
[html]
[test]
Driver = MDBTools
Database = /path/to/mdb/file/test.mdb
[/html]
也可以在在程序中动态设置数据源

python3访问mdb

python3使用pypyodbc或者pyodbc可以访问odbc数据库

  • pypyodbc

先看pypyodbc,这是个python实现的odbc访问模块

安装pypyodbc

1
# python3 setup.py

使用pypyodbc读取mdb

1
2
3
4
5
6
7
8
9
$ python3
>>> import pypyodbc
>>> conn=pypyodbc.connect('Driver=MDBTools;DBQ=/path/to/Record.mdb')
>>> print(conn.cursor().execute('SELECT * FROM Build').fetchone()\[0\])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.3/dist-packages/pypyodbc.py", line 1805, in fetchone
value_list.append(buf_cvt_func(alloc_buffer.value))
ValueError: invalid literal for int() with base 10: b'\\xe0'

mdb文件中中文字符编码为GB码,出现问题,pypyodbc直接崩溃了。

  • pyodbc

pyodbc是C实现的odbc访问模块

安装pyodbc

1
2
# apt-get install python3-dev mdbtools-dev
# python3 setup.py build install

使用pyodbc读取mdb

1
2
3
4
5
6
$ python3
>>> import pyodbc
>>> conn=pyodbc.connect('Driver=MDBTools;DBQ=/path/to/Record.mdb')
>>> s1=conn.cursor().execute('SELECT * FROM Build').fetchone()\[0\]
>>> s1
'냥\\ue59a\\ua7ba鯥\\ue9bd薙'

这次pyodbc没有崩溃,但是输出了乱码。不知是libmdbodbc1还是pyodbc的问题,总之是没有正确的识别GB码,有时间再翻源代码看。

其他方式访问mdb

  • isql

mdbtools自带的isql可以查看mdb,但不能使用动态数据源,只能使用/etc/odbc.ini文件里配置好的数据源,比如这样

$ isql test

  • mdb-export导出表到csv文件

$ mdb-export /path/to/foo.mdb table >> table.csv

mdb-export导出的csv编码是正确的,没有出现乱码。然后可以用pyhton3来处理csv文件。

还可以使用mdb-sqlite将mdb数据库转换到sqlite数据库,然后再用python3访问sqlite数据库,这个没有测试。

===
[erq]