我目前有以下Dockerfile创建我的Docker映像的方法。
FROM python:3.6.6-alpine3.8
# Add dependencies for Python packages pandas, numpy and pyodbc
RUN apk add --no-cache curl gcc g++ unixodbc-dev
RUN ln -s /usr/include/locale.h /usr/include/xlocale.h
# Project files
ARG PROJECT_DIR=/srv/scripts
RUN mkdir -p $PROJECT_DIR
WORKDIR $PROJECT_DIR
COPY requirements.txt ./
# Install Python dependencies
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
我想在此图中包括各种ODBC驱动程序,以便可以使用它们从容器中运行的Python程序连接到不同的数据库。
Pyodbc用于连接数据库。我想从PostgreSQL开始,认为它是最简单的,但是我在Alpine Linux Package Manager中找不到任何软件包。您知道如何安装这样的驱动程序吗?
我对此有点不满意,我希望我遇到的问题很简单...编辑:底部的新信息
我需要连接到远程 mysql (Amazon RDS) 数据库。
遵循几个教程后,我在客户端上安装并配置了 unixodbc 和 libmyodbc,但是当我尝试通过 isql 连接时,出现错误
[08S01][unixODBC][MySQL][ODBC 5.1 Driver]Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
[ISQL]ERROR: Could not SQLConnect
Run Code Online (Sandbox Code Playgroud)
关于这个错误最令人困惑的部分是我没有尝试连接到本地数据库,而是连接到远程数据库。我在客户端上没有 mysql.sock 文件...虽然这不是问题,是吗?
我感觉到配置错误,但我不确定它可能是什么。
如果我运行 odbcinst -j 那么输出是:
DRIVERS............: /etc/unixODBC/odbcinst.ini
SYSTEM DATA SOURCES: /etc/unixODBC/odbc.ini
USER DATA SOURCES..: /root/.odbc.ini
Run Code Online (Sandbox Code Playgroud)
/etc/unixODBC/odbcinst.ini 的内容是:
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib64/libmyodbc5.so
Setup = /usr/lib64/unixODBC/libodbcmyS.so
UsageCount = 5
[MySQL ODBC 515 Driver]
Description = ODBC 5.515 for MySQL
DRIVER = /usr/lib64/libmyodbc5-5.1.5.so
SETUP = /usr/lib64/unixODBC/libodbcmyS.so
UsageCount …Run Code Online (Sandbox Code Playgroud) 下面是一个完整的 ODBC 程序。它所做的只是尝试使用完全限定的连接字符串打开与 SQLite 数据库的连接。我遇到的问题是,当启用 Unicode(使用SQLDriverConnectW()而不是SQLDriverConnect())时,我收到错误消息:
libc++abi.dylib: terminating with uncaught exception of type database_error: connect: IM002: [unixODBC][Driver Manager]Data source name not found, and no default driver specified
Run Code Online (Sandbox Code Playgroud)
我的odbc.ini文件是空的,这是我的odbcinst.ini文件的内容:
[SQLite3]
Description=SQLite ODBC Driver
Driver=/usr/local/Cellar/sqliteodbc/0.9992/lib/libsqlite3odbc-0.9992.dylib
Setup=/usr/local/Cellar/sqliteodbc/0.9992/lib/libsqlite3odbc-0.9992.dylib
Threading=2
Run Code Online (Sandbox Code Playgroud)
在代码的顶部有一个#if 1可以在 Unicode 和非 Unicode 之间切换代码(将其更改#if 0为禁用 Unicode)。当我启用 Unicode 时,出现错误。当我禁用的Unicode,它的作品完美。有什么想法为什么 Unicode 版本的 connect 找不到我的 DSN?
/*
Build command:
clang++ -Wall -Werror \
-std=c++14 -stdlib=libc++ \
-I/usr/local/Cellar/unixodbc/2.3.2_1/include \
-L/usr/local/Cellar/unixodbc/2.3.2_1/lib -lodbc \
unittest.cpp …Run Code Online (Sandbox Code Playgroud) 我已成功使用pyodbc/freeTDS从和ubuntu机器连接到sql server
设置工作正常,但在一段时间后,我收到以下错误
[错误](服务器) - ('IM002','[IM002] [unixODBC] [驱动程序管理器]未找到数据源名称,并且未指定默认驱动程序(0)(SQLDriverConnect)')
这是我的配置
ODBC.INI
[SERVERONE]
Description="test"
Driver=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Servername=sqlserver
Database=DBONE
[SERVERTWO]
Description="test"
Driver=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Servername=sqlserver
Database=DBTWO
Run Code Online (Sandbox Code Playgroud)
.freeTDS.conf
[global]
tds version = 8.0
[sqlserver]
host = <SERVER IP>
instance = R2TEST
port = 1070
tds version = 8.0
text size = 2000000
Run Code Online (Sandbox Code Playgroud)
python模块
class base(object):
_connection = None
def __init__(self):
try:
self._conn_string = ENV.DB.CONNSTRING
logg.debug('using connection string %s'%self._conn_string)
self._connection = pyodbc.connect(self._conn_string)
except Exception:
raise
def _refresh_conn(self):
self._connection = None
self._connection = pyodbc.connect(self._conn_string)
class getConf(base):
def __init__(self):
super(SamlConf,self).__init__() …Run Code Online (Sandbox Code Playgroud) 我能够让它在 Windows 7 上完全运行,但我必须将它移到 Linux 服务器上。我现在正在 VM 中运行 Ubuntu 16.04.1 LTS 64 位以进行测试,然后再在服务器上复制该过程。
我很确定问题出在我的 FreeTDS 或 DSN 设置中。
我应该停止浪费时间而只使用 Python 吗?或者我会在 ODBC 和 unixODBC 上遇到同样的问题吗?
完整的 R 脚本:
library(RODBC)
#saving from a .csv to dataframe df
df <- read.csv("./Documents/test.csv")
#creating connection to db
conn <- odbcDriverConnect('myDSN')
#writing
sqlSave(conn, df, tablename = 'dbo.test0', append = F, rownames = F, verbose = TRUE, safer = true, fast = F)
Run Code Online (Sandbox Code Playgroud)
控制台
> conn <- odbcDriverConnect('myDSN')
Run Code Online (Sandbox Code Playgroud)
返回错误信息:
Warning messages:
1: In odbcDriverConnect("myDSN") :
[RODBC] …Run Code Online (Sandbox Code Playgroud) 我安装unixodbc并unixodbc-dev通过apt-get. 然后我安装了 oracle instantclient(基本驱动程序和 odbc 驱动程序)。现在我正在尝试运行odbc_update_ini.sh,但我为 ODBCDM_Home 参数尝试过的路径似乎都不正确。在OSX我安装的地方unixodbc,brew我能够使用它/usr/local/Cellar/unixodbc/2.3.4/来使事情正常工作。但我无法弄清楚 ubuntu/apt-get 的等效项。
在我的 Mac 上,我尝试使用 unixodbc(来自 Homebrew 的 v.2.3.7)连接到数据库。
odbcinst -j显示:
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /Users/homer/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
Run Code Online (Sandbox Code Playgroud)
~/.odbc.ini和的部分内容/usr/local/etc/odbc.ini:
[mysql-local]
description = local server
Driver = MySQLDriver
SERVER = localhost
USER = testuser
PASSWORD = testpass
DATABASE = testdb
Run Code Online (Sandbox Code Playgroud)
部分内容/usr/local/etc/odbcinst.ini
[MySQLDriver]
Driver = /usr/local/lib/libodbc.dylib
Setup = /usr/local/lib/libodbc.dylib
FileUsage = 1
Run Code Online (Sandbox Code Playgroud)
驱动程序/安装文件链接到一个链接到实际驱动程序的文件:/usr/local/Cellar/unixodbc/2.3.7/lib/libodbc.2.dylib。我已将此文件的权限设置为 755。
然后我尝试连接:
isql mysql-local testuser testpass -v
Run Code Online (Sandbox Code Playgroud)
结果是: …
我在 python 中工作。我使用 Macbook 进行开发,操作系统版本是 Catalina。我正在尝试使用 pyodbc 连接 MSSQL Server。我也安装了 SQL 驱动程序及其依赖项。但是在连接时我收到此错误。
Exception - ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib '/usr/local/lib/libmsodbcsql.13.dylib' : file not found (0) (SQLDriverConnect)")
Run Code Online (Sandbox Code Playgroud)
我检查了文件路径'/usr/local/lib/libmsodbcsql.13.dylib'。实际上文件在那里可用。谁能帮我?
我试图让 SQL Server 的 ODBC 驱动程序 17 工作,但不知何故它不在我全新的苹果 M1 上。显然我安装了 unixodbc 和驱动程序,但启动它们不起作用。看起来 odbc 驱动程序还没有为架构做好准备(见下面的输出)。甚至看起来不像是微软驱动程序的问题,而是来自 unixodbc 的通用库——我说得对吗?
如果可以自己编译,有什么想法吗?
XXX@M1 ~ % odbcinst -j
unixODBC 2.3.9
DRIVERS............: /opt/homebrew/etc/odbcinst.ini
SYSTEM DATA SOURCES: /opt/homebrew/etc/odbc.ini
FILE DATA SOURCES..: /opt/homebrew/etc/ODBCDataSources
USER DATA SOURCES..: /Users/XXX/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
XXX@M1 ~ % sqlcmd
dyld: Library not loaded: /usr/local/lib/libodbc.2.dylib
Referenced from: /opt/homebrew/bin/sqlcmd
Reason: no suitable image found. Did find:
/usr/local/lib/libodbc.2.dylib: mach-o, but wrong architecture
/usr/local/lib/libodbc.2.dylib: mach-o, but wrong architecture
/opt/homebrew/Cellar/unixodbc/2.3.9/lib/libodbc.2.dylib: mach-o, but wrong …Run Code Online (Sandbox Code Playgroud) 我正在尝试让 Cloudera Impala ODBC 在全新的M1 Mac上运行。为此,我通过官方 MS 文档安装了 MS ODBC 18 ,并遵循了Cloudera ODBC 连接器安装指南。
但是,当尝试连接时,我收到以下错误:
[Error: [odbc] Error connecting to the database] {
odbcErrors: [
{
state: '01000',
code: 0,
message: "[unixODBC][Driver Manager]Can't open lib '/opt/cloudera/impalaodbc/lib/universal/libclouderaimpalaodbc.dylib' : file not found"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我的 ODBC 安装:
myuser@computer ~ % odbcinst -j
unixODBC 2.3.11
DRIVERS............: /opt/homebrew/etc/odbcinst.ini
SYSTEM DATA SOURCES: /opt/homebrew/etc/odbc.ini
FILE DATA SOURCES..: /opt/homebrew/etc/ODBCDataSources
USER DATA SOURCES..: /Users/myuser/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW …Run Code Online (Sandbox Code Playgroud)