标签: pyodbc

在Python中,使用pyodbc,如何执行事务?

我有一个用户名,我必须在很多(最多约25个)表中进行更改.(是的,我知道.)原子事务似乎是这种事情的方法.但是,我不知道如何用pyodbc做到这一点.我以前见过关于原子事务的各种教程,但从未使用它们.

设置:Windows平台,Python 2.6,pyodbc,Microsoft SQL 2005.我已经将pyodbc用于单个SQL语句,但没有使用复合语句或事务.

SQL的最佳实践似乎表明创建存储过程非常适合这种情况.我对执行存储过程的担心如下,按重要性递增:1)我从未编写过存储过程.2)我听说pyodbc还没有返回存储过程的结果.3)这绝对不是我的数据库.它是供应商提供的,供应商更新的,等等.

那么,最好的方法是什么?

python transactions pyodbc

6
推荐指数
2
解决办法
1万
查看次数

pyodbc和mySQL

我无法使用pyodbc连接到mySQl db.

这是我的脚本的片段:

import pyodbc
import csv

cnxn = pyodbc.connect("DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost;DATABASE=mydb; UID=root; PASSWORD=thatwouldbetelling;") 
crsr = cnxn.cursor()

with open('C:\\skunkworks\\archive\\data\\myfile.csv','r') as myfile:
    rows = csv.reader(myfile, delimiter=',', quotechar='"')
    for row in rows:
        insert_str = 'INSERT into raw_data VALUES(something, something)'
        print insert_str
        #crsr.execute(insert_str)
    cnxn.commit()
    myfile.close()
Run Code Online (Sandbox Code Playgroud)

我在pyodbc.connect()行收到此错误:

pyodbc.Error:('IM002','[IM002] [Microsoft] [ODBC驱动程序管理器]未找到数据源名称且未指定默认驱动程序(0)(SQLDriverConnectW)')

我有另一个关于此错误的问题(以及一般的Python脚本).当我将其作为脚本运行时,它会无声地失败(我期待堆栈跟踪).我必须手动键入每一行以查找错误发生的位置.

我现在有点懒(没有异常处理) - 没有异常处理的Python脚本的这种正常行为是否会无声地失败?

[编辑]

我没有使用mysqldb,因为我已经在使用pyodbc从另一个源(MS Access)中提取数据.好吧,这不是一个很好的理由 - 但我已经在努力解决pyodbc了,我真的不想与另一个库/模块/软件包(无论是用Python调用)进行"一次性"工作.我只想将Windows环境中各种数据源的数据移动到Linux上的mySQl.一旦在Linux上,我将重新回到terra firma.

这就是整个'剧本'.我刚刚将上面的代码保存到扩展名为.py的文件中,并在命令行运行python myscript.py.我在我的XP机器上运行它

python mysql exception-handling pyodbc

6
推荐指数
1
解决办法
2万
查看次数

使用Python/pyodbc插入Access DB

我正在尝试使用Python/pyodbc将一些csv数据插入到Access 2007数据库中.我在Access中测试了一个工作追加查询,它选择了标题和一行值.

INSERT INTO AssetDetails ( [Reporting Account Number], [As Of Date], [Asset Type], [Security Description 1], [Shares/Par], [Base Price], [Base Cost], CUSIP, Ticker, ISIN, SEDOL ) 
VALUES ("ABCD99020002", "1/31/2010", "CASH & CASH EQUIVALENTS", "INTEREST RECEIVABLE", "0.000", "1.00", "1,171,069.04", "", "", "", "");
Run Code Online (Sandbox Code Playgroud)

在pyodbc中运行此查询会产生:

ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver] Invalid bracketing of name '[0.000]'. (-1002) (SQLExecDirectW)")
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我认为有可能是引起麻烦的数字周围的引号.我转到了以下查询:

SQL = '''INSERT INTO AssetDetails([Reporting Account Number], [As Of Date], [Asset Type], [Security Description 1], [Shares/Par], [Base Price], [Base Cost], CUSIP, …
Run Code Online (Sandbox Code Playgroud)

python sql ms-access odbc pyodbc

6
推荐指数
1
解决办法
4031
查看次数

Python中的"以前的SQL不是查询"错误?

我试图在Python中调用存储过程,但它一直给我以下错误.该过程是用SQL Server 2008编写的,我使用PyODBC来调用方法并将参数传递给它.

import pyodbc
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+serveripaddr+';DATABASE='+database+';UID='+userid+';PWD='+password+'')
cursor = cnxn.cursor()
cursor.execute("{call p_GetTransactionsStats('KENYA', '41')}")
rows = cursor.fetchall()
Run Code Online (Sandbox Code Playgroud)

最后一行导致以下异常:

ProgrammingError: No results.  Previous SQL was not a query.
Run Code Online (Sandbox Code Playgroud)

这可能是什么问题?

python sql sql-server pyodbc

6
推荐指数
2
解决办法
5705
查看次数

使用 SQLAlchemy 时 pandas.read_sql() 比 pyodbc 慢得多

我正在尝试从 SQL 读取一个小表,并且正在考虑从 pyodbc 切换到 SQLAlchemy 以便能够使用 pd.to_sql()

当我比较两者时,sql alchemy 慢得多。

s_py = """\
import pandas as pd
import pyodbc
cxn = pyodbc.connect('DRIVER={SQL SERVER};SERVER=.\;DATABASE=PPIS;UID=sa;PWD=pwd')
"""

s_alch = """\
import pandas as pd
import sqlalchemy
cxn = sqlalchemy.create_engine("mssql+pyodbc://sa:pwd@./PPIS?driver=SQL+Server")
"""
timeit.timeit('pd.read_sql("SELECT * FROM Operators", cxn)',setup=s_py, number=100)
Run Code Online (Sandbox Code Playgroud)

输出[21]:0.18496091418973037

timeit.timeit('pd.read_sql("SELECT * FROM Operators", cxn)',setup=s_alch, number=100)
Run Code Online (Sandbox Code Playgroud)

输出[23]:4.407356934717654

我见过这个谈论插入行。但为什么读取速度会慢很多呢?

python sqlalchemy pyodbc pandas

6
推荐指数
0
解决办法
2420
查看次数

在Alpine Linux Docker容器中安装ODBC驱动程序

我目前有以下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程序连接到不同的数据库。

  • Python程序Pyodbc用于连接数据库。
  • 我需要安装的ODBC驱动程序是:
    • PostgreSQL的
    • 的MySQL
    • 女士SQL Server
    • Teradata
    • 甲骨文
    • 蜂巢
    • 黑斑羚

我想从PostgreSQL开始,认为它是最简单的,但是我在Alpine Linux Package Manager中找不到任何软件包。您知道如何安装这样的驱动程序吗?

odbc unixodbc pyodbc docker dockerfile

6
推荐指数
2
解决办法
5352
查看次数

从 OpenShift 中运行的 Python 连接到 Azure SQL 数据库时,SQL_HANDLE_HENV 上的驱动程序的 SQLAllocHandle 失败 (0) (SQLDriverConnect)

仅当尝试从在 OpenShift 容器中运行的 Python 3.7 连接到我的 Azure DB 时(来自 rhel7:latest),我看到以下错误:

sqlalchemy.exc.DBAPIError: (pyodbc.Error) ('IM004', "[IM004][unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed (0) (SQLDriverConnect)
Run Code Online (Sandbox Code Playgroud)

我在我的 MAC、Windows 和运行 RHEL7 基本容器的 RHEL7 Virtualbox 上的 Docker 中尝试了完全相同的代码 - 它始终有效!问题仅出现在我在 OpenShift 中运行的容器中!我检查了我可以在 1433 年从 Openshift telnet 到我的 Azure DB 服务器。

我也启用了 ODBC 日志,但没有比上述错误更多的信息。

我还应该检查什么?

以下是我在 Dockerfile 中设置 MSODBC 驱动程序的方法:

RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo && \
 yum remove unixODBC-utf16 unixODBC-utf16-devel && \
 ACCEPT_EULA=Y yum install -y msodbcsql17 && \
 yum install -y unixODBC-devel
Run Code Online (Sandbox Code Playgroud)

这是引发错误的代码:

在modules.database里面:

pyodbc_connstring_safe = …
Run Code Online (Sandbox Code Playgroud)

pyodbc python-3.x azure-sql-database openshift-3 msodbcsql17

6
推荐指数
1
解决办法
7865
查看次数

使用 MFA Active Directory 交互式身份验证在 Python 中连接到 Azure SQL,而不使用 Microsoft.IdentityModel.Clients.ActiveDirectory dll

要使用 MFA(在 SSMS 中作为“Active Directory - Universal”)连接到 Azure SQL 数据库,Microsoft 建议并且目前只有使用 Microsoft.IdentityModel.Clients.ActiveDirectory 与 C# 连接的教程

Authentication='Active Directory Interactive';从 Python 或 Powershell设置常规 ODBC 连接字符串会导致错误

Cannot find an authentication provider for 'ActiveDirectoryInteractive'
Run Code Online (Sandbox Code Playgroud)

这似乎是因为根据https://docs.microsoft.com/en-us/azure/sql-database/active-directory-interactive-connect-azure-sql-db 上的Microsoft 示例代码,您需要明确创建自己的创建连接时的身份验证提供程序类:


        public static void Main(string[] args)
        {
            var provider = new ActiveDirectoryAuthProvider();

            SC.SqlAuthenticationProvider.SetProvider(
                SC.SqlAuthenticationMethod.ActiveDirectoryInteractive,
                //SC.SqlAuthenticationMethod.ActiveDirectoryIntegrated,  // Alternatives.
                //SC.SqlAuthenticationMethod.ActiveDirectoryPassword,
                provider);

            Program.Connection();
        }
Run Code Online (Sandbox Code Playgroud)

我想与pyodbc 连接,所以我无法实现ActiveDirectoryInteractive 提供程序。

有什么方法可以使用 OAuth 获取令牌并在连接字符串中使用它,或者在不使用 .NET 的情况下以其他方式实现 ActiveDirectoryInteractive 提供程序?

odbc azure pyodbc azure-sql-database multi-factor-authentication

6
推荐指数
2
解决办法
4906
查看次数

SystemError: <class 'pyodbc.Error'> 返回一个带有错误集的结果

def insert(self):
    conn = pyodbc.connect(
        'Driver={SQL Server};'
        'Server=DESKTOP-S0VG212\SQLEXPRESS;'
        'Database=MovieGuide;'
        'Trusted_Connection=yes;'
    )
    cursor = conn.cursor()
Run Code Online (Sandbox Code Playgroud)

执行查询时发生错误,但我不知道是什么原因造成的。

cursor.execute('insert into Movies(MovieName,Genre,Rating,Username) values(?,?,?,?);',
               (self.moviename, self.moviegenre, self.ratebox, self.username))
conn.commit()
Run Code Online (Sandbox Code Playgroud)

python sql-server pyodbc

6
推荐指数
1
解决办法
4598
查看次数

RHEL 8 容器 MSSQL ODBC 驱动程序 e2fsprogs

我正在尝试使用 RHEL 8 UBI 构建自定义 docker 容器。作为其中的一部分,我想安装 MSSQL 17 ODBC 驱动程序。我已经按照微软文档中概述的步骤操作:https : //docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql- server?view=sql-server-ver15#redhat17

并将 Microsoft 存储库添加到我的yum.repos.d目录中,但是当我尝试构建容器时,出现以下错误:nothing provides e2fsprogs needed by msodbcsql17-17.6.1.1-1.x86_64

当我进一步深入研究时,它看起来好像是 RHEL-7 Microsoft 建议手动安装 e2fsprogs,您可以在这里看到:https : //docs.microsoft.com/en-us/sql/connect/odbc /linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15#offline-installation

不幸的是,这在 RHEL-8 中是不可能的,因为 e2fsprogs-static 已被删除:https : //access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/thinkations_in_adopting_rhel_8/index#removed-packages_changes-到包

构建的完整输出是:

$  docker build -f ./test.dockerfile -t daark:1 .
Sending build context to Docker daemon  25.77MB
Step 1/7 : FROM registry.redhat.io/ubi8/ubi
 ---> a1f8c9699786
Step 2/7 : RUN curl https://packages.microsoft.com/config/rhel/8/prod.repo > /etc/yum.repos.d/mssql-release.repo
 ---> Using cache
 ---> 90b3e1514239
Step …
Run Code Online (Sandbox Code Playgroud)

sql-server odbc pyodbc docker rhel8

6
推荐指数
2
解决办法
1042
查看次数