python使用odbc连接db2、sqlserver数据库

这篇具有很好参考价值的文章主要介绍了python使用odbc连接db2、sqlserver数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先介绍安装odbc驱动,如果已安装跳过次环节

一、Linux环境下安装odbc驱动

参考链接:linux环境odbc驱动安装 - 哔哩哔哩

也可参考微软官网(Windows驱动也有介绍):安装 Microsoft ODBC Driver for SQL Server (Linux) - ODBC Driver for SQL Server | Microsoft Learn

ODBC Driver是一种动态链接库 (DLL),支持 ODBC 的应用程序(如 Excel)可以用它来访问 ODBC 数据源。每个 ODBC 驱动程序针对一个数据库管理系统 (DBMS),如 SQL Server、Access 等等。

1. 安装前检查环境gcc/make编译器

[root@dca01 tmp]# rpm -qa | egrep 'gcc|make'

# 如果没有以上工具,可以搭建yum源快速安装

[root@dca01 tmp]# yum -y install gcc make

2.下载ODBC驱动


下载地址:http://ftp.unixodbc.org/

3. 安装ODBC驱动【以unixODBC-2.3.1版本为例】

[root@loaclhost ~]# tar -xvf unixODBC-2.3.1.tar.gz
[root@loaclhost ~]# cd unixODBC-2.3.1/

#--prefix=/test指定安装目录为/test,如果不指定会默认安装到/usr/local,根据需要确定是否指定其他安装目录;如果是arm架构机器,执行 . /configure --prefix=/test --build=arm-linux,高版本unixODBC不区分架构使用./configure --prefix=/test即可

[root@loaclhost unixODBC-2.3.1]# ./configure --prefix=/test

[root@localhost unixODBC-2.3.1]# make

[root@localhost unixODBC-2.3.1]# make install

# 输出odbc driver配置项路径等内容,注意下方截图为2.3.1版本,重点关注 unixODBC 2.3.1所在行下面的内容;如果执行后发现drivers,system data sources等项配置的路径跟实际情况不符合,可以执行export ODBCSYSINI=/test/etc ,重新执行odbcinst -j后如果没有问题,更新至环境变量

[root@localhost unixODBC-2.3.1]# odbcinst -j

4.配置文件编写

USER DATA SOURCES 对应的文件里面内容为空,不需要写配置项

1.odbc.ini

#此处的odbc.ini路径是通过odbcinst -j输出的SYSTEM DATA DOURCES项的路径

vim /usr/local/etc/odbc.ini

#将以下内容根据实际情况填写

[dm8] #driver name 用于isql 测试

Description = DM ODBC DSND

# 这里填的驱动需与 odbcinst.ini 中的节点名称相同

Driver = DM8 ODBC DRIVER

# 达梦数据库的地址,也可以填写具体ip,例127.0.0.1

SERVER = localhost

# 数据库用户名,根据数据库的实际情况填写

UID = SYSDBA

# 数据库密码,根据实际情况填写

PWD = Dameng123

# 达梦数据库端口,根据实际情况填写

TCP_PORT = 5238


2.odbcinst.ini 

#此处的odbc.ini路径是通过odbcinst -j输出的DRIVERS项的路径

vim /usr/local/etc/odbcinst.ini

#将以下内容根据实际情况填写

[DM8 ODBC DRIVER]

Description = ODBC DRIVER FOR DM8

#此处填写的地址是{DM_HOME}/bin/libdodbc.so,按照实际情况填写,{DM_HOME}为达梦数据库安装目录,举个例子:/test/dmdba/dmdbms/bin/libdodbc.so

DRIVER = /test/dmdba/dmdbms/bin/libdodbc.so

5.验证连接

#如果输出结果为下图,表示连接成功

isql dm8 -v

6.配置odbc常见问题&解决方案

    1.报错 “[IM002][unixODBC][Driver Manager]Data source name not found, and no default driver specified [ISQL]ERROR: Could not SQLConnect”

    a.  配置文件odbcinst.ini和odbc.ini路径是否正确,配置项是否正确

    b.  配置文件odbcinst.ini和odbc.ini中每一行的开头不允许有空格

    c.  如果发现odbcinst.ini路径不符合预期,可以通过export ODBCSYSINI=/DCE/rc110/etc/进行变更,注意后面的路径前缀根据实际情况变更

     2. 报错[IM004] [Microsoft][ODBC Driver Manager] Driver's SQLAllocHandle on SQL_HANDLE_ENV

    a.  检查odbcinst.ini文件配置的driver路径是否存在,注意指向的是libdodbc.so的path

     3. 安装unixODBC完成但是执行odbcinst -j 提示command not found

    a.  使用root账户编辑/etc/profile ,将odbcinst所在目录追加到环境变量

    4. 报错"[01000][unixODBC][Driver Manager]Can’t open lib ‘/dm8/dmdba/dmdbms/bin/libdodbc.so’ : file not found [ISQL]ERROR: Could not SQLConnect"

    a.  配置环境变量LD_LIBRARY_PATH

#以root身份编辑
vim /etc/profile
#/dm8/dmdba/dmdbms为达梦数据库安装目录即前面提到的{DM_HOME}
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/dm8/dmdba/dmdbms/bin/"
export PATH=$PATH:/dm8/dmdba/dmdbms/bin
#在对应用户身份下的目录执行
source /etc/profile

    b. 确认libdodbc.so所在路径当前用户有权限,如果没有权限需要切换到root用户修改一下文件夹权限

     #注意此处的路径根据实际安装情况来

chmod 755 {DM_HOME}


     5. symbol lookup error: /home/***/bin/libdodbc.so: undefined symbol : os_mutex2_create

        a. 检查环境变量,一般是LD_LIBRARY_PATH环境变量配置问题;目前遇到这个问题是在非root用户下,发现/etc/profile中设置的环境变量,和 ~/.bashrc中设置有冲突,删除/etc/profile下对应内容,并在~/.bashrc中设置即可

二、编写python代码连接数据库

参考链接:使用ODBC连接db2数据库_zwwangoo的博客-CSDN博客 

import sys
import traceback
import pandas as pd
import pyodbc
from urllib.parse import quote_plus as urlquote
# 数据库信息示例
from sqlalchemy import create_engine



def db_query(sql, dbtype='doris', conp=None):
    """
    执行sql返回DataFrame类型数据
    conp= [user,passwd,host,port, db]

    create_engine 还有很多可选参数,这里介绍几个重要的参数:

    echo :为 True 时候会把sql语句打印出来,当然,你可以通过配置logger来控制输出,这里不做讨论。
    pool_size: 是连接池的大小,默认为5个,0表示连接数无限制
    pool_recycle: MySQL 默认情况下如果一个连接8小时内容没有任何动作(查询请求)就会自动断开链接,出现 MySQL has gone away的错误。设置了 pool_recycle 后 SQLAlchemy 就会在指定时间内回收连接。如果设置为3600 就表示 1小时后该连接会被自动回收。
    pool_pre_ping : 这是1.2新增的参数,如果值为True,那么每次从连接池中拿连接的时候,都会向数据库发送一个类似 select 1 的测试查询语句来判断服务器是否正常运行。当该连接出现 disconnect 的情况时,该连接连同pool中的其它连接都会被回收。
    :param sql:
    :param dbtype:
    :param conp:
    :return:
    """
    con = None
    df = pd.DataFrame()
    err = None
    sql = sql.replace("'null'", 'null')
    if not conp: return None, 0
    try:
        if dbtype == 'postgresql':
            con = create_engine("postgresql://%s:%s@%s:%s/%s" % (
                conp[0], conp[1], conp[2], conp[3], conp[4]), echo=True,
                                pool_pre_ping=True, encoding='utf-8')
            if len(conp) == 5: conp.append('public')
            sql = "set search_path to %s;" % conp[5] + sql
        elif dbtype == 'oracle':
            con = create_engine('oracle://%s:%s@%s:%s/%s' % (
                conp[0], conp[1], conp[2], conp[3], conp[4]), echo=True,
                                pool_pre_ping=True, encoding='utf-8')
        elif dbtype == 'sqlite':
            con = create_engine('sqlite:///%s' % conp)

        elif dbtype == 'doris':
            con = create_engine('mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8' % (
                conp[0], conp[1], conp[2], conp[3], conp[4]), echo=True,
                                pool_pre_ping=True, encoding='utf-8')
        elif dbtype == 'sqlserver':
            params = urlquote((f"DRIVER={{SQL Server}};SERVER={conp[2]};PORT={conp[3]};DATABASE={conp[4]};UID={conp[0]};PWD={conp[1]}"))
            connect_string = (f"mssql+pyodbc:///?odbc_connect={params}")
            con = create_engine(connect_string, echo=True, pool_pre_ping=True, encoding='utf-8')
        elif dbtype == 'db2':
            con = create_engine("db2+ibm_db://%s:%s@%s:%s/%s?charset=utf8" % (conp[0], conp[1], conp[2], conp[3], conp[4]), echo=True, pool_pre_ping=True, encoding='utf-8')

        else:
            con = create_engine('mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8' % (
                conp[0], conp[1], conp[2], conp[3], conp[4]), echo=True, pool_pre_ping=True, encoding='utf-8')

        df = pd.read_sql(sql, con)
        con.dispose()
        return df, 1
    except Exception as e:
        err = traceback.format_exc()
        print(err)
    finally:
        if con is not None: con.dispose()
        if not df.empty and len(df) != 0:
            return df, 1
        else:
            return err, 0

 文章来源地址https://www.toymoban.com/news/detail-499273.html

到了这里,关于python使用odbc连接db2、sqlserver数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python连接SQLserver数据库

    前进四的状态出发! 学习Python 连接 数据库 解决问题: 1:如何连接数据库 2:如何进行简单查询 3:如何将查询中的中文乱码给修复 4:如何进行插入,更新,删除 主要在pymssql.connect 中添加charset = ‘cp936’ 原因:因为字符串字段类型为:varchar,造成读取数据乱码。 方法一的缺点: 如果

    2024年02月02日
    浏览(36)
  • 使用Java连接SQLserver数据库

    使用win10、SQLServer2012、eclipse2020-6、Java1.8.0_311    下载sqljdbc_6.0.8112.200_chs.tar.gz,再将其解压sqljdbc_6.0.8112.200_chs.tar  这里x64是在适于64位,x86是适于32位,选择合适自己电脑的,这里我的是64位的计算机,选择x64文件中的文件,下如图。 将此文件sqljdbc_auth.dll复制到D:Javajdk1.8.

    2024年02月08日
    浏览(31)
  • QT学习笔记-Linux ARM环境下实现QT程序通过ODBC驱动访问SQLServer数据库

    在嵌入式系统中使用QT开发上位机应用时不可避免的会涉及访问各种数据库的场景,而服务端数据库的种类则有多种可能(Oracle、Postgresql、MySql、SQLServer),本文就介绍一下如何实现在Linux Arm环境下实现QT程序通过ODBC驱动访问SQLServer数据库的。 开发环境操作系统:windows10专业

    2024年02月12日
    浏览(44)
  • 使用SqlSugar连接多个数据库(sqlserver,sqlite,mysql)

        有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数

    2023年04月08日
    浏览(43)
  • ODBC连接数据库详细说明

    开放数据库互连(ODBC)是微软提出的数据库访问接口标准。开放数据库互连定义了访问数据库的API一个规范,这些API独立于不同厂商的DBMS,也独立于具体的编程语言。通过使用ODBC,应用程序能够使用相同的源代码和各种各样的数据库进行交互。这使得开发者不需要以特殊的

    2023年04月08日
    浏览(36)
  • .NET Core/.NET6 使用DbContext 连接数据库,SqlServer

    安装以下NuGet包 Microsoft.EntityFrameworkCore.SqlServer:SQL server 需要添加包 Microsoft.EntityFrameworkCore.Tools Newtonsoft.Json:用于Json格式转换 创建一个实体类来表示数据库表。在项目中创建一个名为Customer.cs的文件,并添加以下代码 创建一个数据库上下文类,用于定义实体类和数据库连接

    2024年02月07日
    浏览(38)
  • Flink CDC 2.3 发布,持续优化性能,更多连接器支持增量快照,新增 Db2 支持

    01 Flink CDC 简介 Flink CDC  [ 1] 是基于数据库的日志 CDC 技术,实现了全增量一体化读取的数据集成框架。配合 Flink 优秀的管道能力和丰富的上下游生态,Flink CDC 可以高效实现海量数据的实时集成。 作为新一代的实时数据集成框架,Flink CDC 具有全增量一体化、无锁读取、并行读

    2024年02月01日
    浏览(29)
  • Qt通过ODBC连接openGauss数据库

    本文就介绍了Qt通过ODBC连接opengauss数据库的基础内容。 在.pro文件中添加一行引入 添加如下测试代码 说明成功连接openGauss数据库 什么是ODBC ODBC(Open Database Connectivity,开放数据库互连)是由Microsoft公司基于X/OPEN CLI提出的用于访问数据库的应用程序编程接口。应用程序通过O

    2024年02月05日
    浏览(42)
  • 什么是 ODBC – 开放式数据库连接

    开放式数据库连接 (ODBC) 是用于访问数据库的开放式标准应用程序编程接口 (API)。1992年,微软与Simba合作打造了世界上第一个ODBC驱动;SIMBA.DLL 和基于标准的数据访问诞生了。通过在程序中使用 ODBC 语句,您可以访问多个不同公共数据库中的文件。除了 ODBC 软件,每个要访问的

    2024年02月06日
    浏览(32)
  • 配置ODBC驱动连接DM8数据库

    ODBC提供访问不同类型的数据库的途径。结构化查询语言 SQL 是一种用来访问数据库的语言。通过使用 ODBC,应用程序能够使用相同的源代码和各种各样的数据库交互。这使得开发者不需要以特殊的数据库管理系统 DBMS 为目标,或者了解不同支撑背景的数据库的详细细节,就能

    2024年02月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包