我有一个用户名,我必须在很多(最多约25个)表中进行更改.(是的,我知道.)原子事务似乎是这种事情的方法.但是,我不知道如何用pyodbc做到这一点.我以前见过关于原子事务的各种教程,但从未使用它们.
设置:Windows平台,Python 2.6,pyodbc,Microsoft SQL 2005.我已经将pyodbc用于单个SQL语句,但没有使用复合语句或事务.
SQL的最佳实践似乎表明创建存储过程非常适合这种情况.我对执行存储过程的担心如下,按重要性递增:1)我从未编写过存储过程.2)我听说pyodbc还没有返回存储过程的结果.3)这绝对不是我的数据库.它是供应商提供的,供应商更新的,等等.
那么,最好的方法是什么?
我无法使用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/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 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)
这可能是什么问题?
我正在尝试从 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
我见过这个谈论插入行。但为什么读取速度会慢很多呢?
我目前有以下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中找不到任何软件包。您知道如何安装这样的驱动程序吗?
仅当尝试从在 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
要使用 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
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) 我正在尝试使用 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) pyodbc ×10
python ×6
odbc ×4
sql-server ×3
docker ×2
sql ×2
azure ×1
dockerfile ×1
ms-access ×1
msodbcsql17 ×1
multi-factor-authentication ×1
mysql ×1
openshift-3 ×1
pandas ×1
python-3.x ×1
rhel8 ×1
sqlalchemy ×1
transactions ×1
unixodbc ×1