暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译] 在 Linux 上使用 SQLite 安装 ODBC 驱动程序管理器

原创 樱桃小丸子 2022-06-20
3069

原文地址:Installing the ODBC Driver Manager with SQLite on Linux
原文作者:Cesare Cervini

本文是包括 Firebird、Postgresql、Microsoft SQLServer、Oracle RDBMS、HSQLDB、MariaDB、MongoDB 和 Excel 在内的系列文章的一部分,目标是建立一个独立的环境来测试此处介绍的 gawk 的 ODBC 扩展。除了本部分处理 ODBC 驱动程序管理器的安装是先决条件外,每个部分都可以独立于其他部分使用。
测试系统是 debian v11 (bullseye)

安装 ODBC 驱动程序管理器

Linux 下 ODBC 的主要实现有 2 个:UnixODBC (http://www.unixodbc.org/) 和 iODBC (http://www.iodbc.org);我们没有特别的原因选择了前者。
驱动管理器可以通过 Debian 中的标准包管理工具以 root 身份安装:

root@debian:~# apt-get install libodbc1
root@debian:~# apt install unixodbc 
 
root@debian:~# odbcinst -j
unixODBC 2.3.6
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

系统范围的文件 /etc/odbcinst.ini 存储已安装的 ODBC 驱动程序列表并由 root 维护。它是默认的,但它的位置可以在环境变量 $ODBCINST 中更改和设置。
让我们在用户 debian 的主目录中创建一个工作文件夹,即我们的测试帐户:

$ id
uid=1000(debian) gid=1000(debian) groups=1000(debian)
$ mkdir ~/odbc4gawk
$ export workdir=~/odbc4gawk
$ mkdir $workdir
$ cd $workdir

由于大多数 ODBC 驱动程序的共享库都安装在 /usr/lib/x86_64-linux-gnu/odbc 中,因此必须将此路径添加到必须使用 ODBC 的任何用户的 $LD_LIBRARY_PATH 环境变量中,最好在 ~/.bashrc 中文件(如果 bash 是选择外壳):

export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/odbc:$LD_LIBRARY_PATH

我们现在准备为每个感兴趣的数据源安装 ODBC 驱动程序。

安装 SQLite ODBC 驱动程序

SQLite 及其管理工具 isql 由本机包管理器以 root 身份安装:

# apt install sqlite3
# apt install libsqliteodbc

每次安装 ODBC 驱动程序时,它都会使用驱动程序相关信息更新文件 /etc/odbcinst.ini,稍后可以使用上述命令 odbcinst 检查这些信息,例如:
列出已安装的 ODBC 驱动程序:

$ odbcinst -q -d
[SQLite3]

查询特定驱动程序:

$ odbcinst -q -d -n SQLite
SQLite3]
Description=SQLite3 ODBC Driver
Driver=libsqlite3odbc.so
Setup=libsqlite3odbc.so
UsageCount=1

作为用户 debian,编辑文件 ~/.odbc.ini 并添加我们将使用的 SQLite 数据源的详细信息:

$ cd $workdir 
$ mkdir sqlite
$ cd sqlite
$ vi ~/.odbc.ini
[mysqlitedb]
Description=My SQLite sample database
Driver=SQLite3
Database=/home/debian/odbc4gawk/sqlite/sampledb

让我们检查一下:
列出当前在 ~/.odbc.ini 中定义的所有 DSN

$ odbcinst -q -s
[mysqlitedb]

列出我们的新 DSN:

$ odbcinst -q -s -n mysqlitedb
[mysqlitedb]
Description=My SQLite sample database
Driver=SQLite3
Database=/home/debian/odbc4gawk/sqlite/sampledb

也就是我们刚才在上面输入的信息。

~/.odbc.ini 文件允许隐藏驱动程序的私有设置,以便以后不需要指定它们。连接到数据源时,此处在方括号之间指定的名称 DSN 就足够了。当以编程方式连接时,也可以直接在本节中直接指定内联所有参数,但如果必须更改代码,则需要编辑(并且可能重新编译)代码,因此最好使用 DSN。
默认文件位置是当前用户的主目录,但可以更改它,并且可以在环境变量 $ODBCINI 中设置其完整路径名。

让我们使用 ODBC 驱动程序管理器中包含的命令 isql 来测试通过 ODBC 的连接:

$ isql mysqlitedb -v
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

SQLite 的 ODBC 驱动程序确实有效。

要填充数据库,请启动 sqllite3:

$ /usr/bin/sqlite3
SQLite version 3.34.1 2021-01-20 14:10:07
Enter ".help" for usage hints.
Connected to a transient in-memory database.

使用“.open FILENAME”重新打开持久数据库。

1sqlite> .open sampledb

文件 sampledb 已在 ~/.odbc.ini 中指定的目录中创建。
转到以下链接,复制 SQL 语句并将它们粘贴到 sqllite3:表创建和插入数据。

仍在 sqlite3 中,通过运行上面列出的测试 SQL 查询来检查数据库是否已填充:

sqlite> SELECT
        c.country_name,
        c.country_id,
        l.country_id,
        l.street_address,
        l.city
FROM
        countries c
LEFT JOIN locations l ON l.country_id = c.country_id
WHERE
        c.country_id IN ('US', 'UK', 'CN');
Output:
China|CN|||
United Kingdom|UK|UK|8204 Arthur St|London
United Kingdom|UK|UK|Magdalen Centre, The Oxford Science Park|Oxford
United States of America|US|US|2014 Jabberwocky Rd|Southlake
United States of America|US|US|2011 Interiors Blvd|South San Francisco
United States of America|US|US|2004 Charade Rd|Seattle

现在,退出 sqlite3 并从基于 ODBC 的实用程序 isql 重新运行相同的查询:

$ isql -v mysqlitedb
SQL> SELECT c.country_name, c.country_id, l.country_id, l.street_address, l.city FROM countries c LEFT JOIN locations l ON l.country_id = c.country_id WHERE c.country_id IN ('US', 'UK', 'CN')
+---------------------------+-------------+-----------+---------------------------------------------+----------------------+
| country_name              | country_id  | country_id| street_address                              | city                 |
+---------------------------+-------------+-----------+---------------------------------------------+----------------------+
| China                     | CN          |           |                                             |                      |
| United Kingdom            | UK          | UK        | 8204 Arthur St                              | London               |
| United Kingdom            | UK          | UK        | Magdalen Centre, The Oxford Science Park    | Oxford               |
| United States of America  | US          | US        | 2014 Jabberwocky Rd                         | Southlake            |
| United States of America  | US          | US        | 2011 Interiors Blvd                         | South San Francisco  |
| United States of America  | US          | US        | 2004 Charade Rd                             | Seattle              |
+---------------------------+-------------+-----------+---------------------------------------------+----------------------+
SQLRowCount returns 0
6 rows fetched

注意:输出已经缩小一点以减少水平滚动。

到目前为止一切看起来都不错。现在让我们以 root 身份安装 python 的 pyodbc ODBC 模块;

# apt install pip
# needed to compile pyodbc:
# apt install unixodbc-dev
# pip install pyodbc
作为 debian,使用以下连接字符串执行以下 python 脚本:

import pyodbc 
cnxn = pyodbc.connect(DSN='mysqlitedb;UID=SA;PWD=admin2021!')
cursor = cnxn.cursor()  
cursor.execute("""SELECT
        c.country_name,
        c.country_id,
        l.country_id,
        l.street_address,
        l.city
FROM
        countries c
LEFT JOIN locations l ON l.country_id = c.country_id
WHERE
        c.country_id IN ('US', 'UK', 'CN')""")
row = cursor.fetchone() 
while row:
    print (row) 
    row = cursor.fetchone()
Output:
('China', 'CN', None, None, None)
('United Kingdom', 'UK', 'UK', '8204 Arthur St', 'London')
('United Kingdom', 'UK', 'UK', 'Magdalen Centre, The Oxford Science Park', 'Oxford')
('United States of America', 'US', 'US', '2014 Jabberwocky Rd', 'Southlake')
('United States of America', 'US', 'US', '2011 Interiors Blvd', 'South San Francisco')
('United States of America', 'US', 'US', '2004 Charade Rd', 'Seattle')Output:


一切都按预期工作。
我们已经完成了通过 ODBC 从 isql 和 python 模块 pyodbc 访问 SQLite 数据库的步骤。使用该 RDBMS 非常简单。一旦 gawk 接口完成,它应该返回相同的输出。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论