如何在 RHEL 类 Docker 映像中更新 FreeTDS 驱动程序?

How do I update FreeTDS driver in RHEL-like Docker image?

我正在使用 pyodbc 将一些表情符号数据从 postgres 数据库对象传递到 SQL Server 2016。

第 5 行有我正在使用的 freeTDS 驱动程序。

def __insert_records(self, rows, target_fields):
        try:      
            mssql_connection = BaseHook.get_connection(self.mssql_conn_id)

            connection = pyodbc.connect(DRIVER='FreeTDS',host=mssql_connection.host,DATABASE=mssql_connection.schema,user=mssql_connection.login,password=mssql_connection.password,ClientCharset='utf-8',port=mssql_connection.port,driver='/usr/lib64/libtdsodbc.so')
            cursor = connection.cursor()

            for i, row in enumerate(rows, 1):
                record = []

                for cell in row:
                    record.append(self._serialize_cell(cell))

                record_dictionary = self.__get_record_dictionary(record, target_fields)
               cursor.execute(self.__generate_insert_sql_statement(record_dictionary))

            connection.commit()

            cursor.close()
            connection.close()
        except pyodbc.ProgrammingError as programmingError:
            sqlstate = programmingError.args[0]
            if sqlstate = '42000':
                print(programmingError.args[0])

我需要更新驱动程序 (freeTDS) 以便在插入表情符号时解决一个错误(相关:https://github.com/FreeTDS/freetds/issues/317)。

更新:访问我的 docker 图像中的 CLI 后,我 运行 tsql -C 获取我的编译时间设置:

Version: freetds v1.1.20

显然您的 Dockerfile 已经包含安装 pyodbc 所需的命令。因此你的容器应该已经有

  • gcc-c++
  • python3-开发
  • unixODBC-devel

现在,无需从 EPEL(或任何地方)安装 freetds,您的 Dockerfile 将需要执行以下操作(在撰写本文时使用最新稳定版本的 FreeTDS):

curl https://www.freetds.org/files/stable/freetds-1.2.18.tar.gz > freetds-1.2.18.tar.gz

tar -xvzf freetds-1.2.18.tar.gz

cd freetds-1.2.18/

./configure

make

sudo make install

echo "" | sudo tee -a /etc/odbcinst.ini > /dev/null

echo "[FreeTDS_1.2.18]" | sudo tee -a /etc/odbcinst.ini > /dev/null

echo "Driver=/usr/local/lib/libtdsodbc.so" | sudo tee -a /etc/odbcinst.ini > /dev/null

那么您应该能够像这样创建一个 pyodbc 连接:

>>> import pyodbc
>>> cnxn = pyodbc.connect("DRIVER=FreeTDS_1.2.18;SERVER=192.168.0.179;PORT=49242;UID=sa;PWD=_whatever_;")
>>> print(cnxn.execute("SELECT @@VERSION").fetchval())
Microsoft SQL Server 2017 (RTM-GDR) (KB4583456) - 14.0.2037.2 (X64) 
    Nov  2 2020 19:19:59 
    Copyright (C) 2017 Microsoft Corporation
    Express Edition (64-bit) on Windows 8.1 Pro 6.3 <X64> (Build 9600: )

>>> print(cnxn.getinfo(pyodbc.SQL_DRIVER_NAME))
libtdsodbc.so
>>> print(cnxn.getinfo(pyodbc.SQL_DRIVER_VER))
01.02.0018