我为 Python 3.2 安装了 pyODBC,我正在尝试更新我作为测试创建的 SQL Server 2008 R2 数据库。
我检索数据没有问题,而且一直有效。
但是,当程序执行 cursor.execute("sql") 以插入或删除行时,它不起作用 - 没有错误,什么都没有。响应就像我成功更新了数据库但没有反映任何更改。
下面的代码本质上是创建一个字典(我稍后有这个计划)并且只是快速构建一个 sql insert 语句(当我测试我写到日志的条目时它起作用)
我的表 Killer 中有 11 行,即使在提交后也不受影响。
我知道这是愚蠢的,但我看不到它。
这是代码:
cnxn = pyodbc.connect('DRIVER={SQL Server Native Client 10.0};SERVER=PHX-500222;DATABASE=RoughRide;UID=sa;PWD=slayer')
cursor = cnxn.cursor()
# loop through dictionary and create insert entries
logging.debug("using test data to build sql")
for row in data_dictionary:
entry = data_dictionary[row]
inf = entry['Information']
dt = entry['TheDateTime']
stat = entry['TheStatus']
flg = entry['Flagg']
# create sql and set right back into row
data_dictionary[row] …Run Code Online (Sandbox Code Playgroud) 根据PEP249,Cursor.execute没有定义的返回值。 pyodbc,然而,似乎使它返回一个游标对象;文档也这么说,虽然相当简短:
execute (...)
C.execute(sql, [params]) --> Cursor
这是否有更详细的保证/记录?
查看身份,返回的对象似乎是完全相同的游标,也许用于链接调用?
>>> thing_called_cursor = conn.cursor()
>>> result = thing_called_cursor.execute("SELECT * FROM Item")
>>> result
<pyodbc.Cursor object at 0x10b3290f0>
>>> thing_called_cursor
<pyodbc.Cursor object at 0x10b3290f0>
Run Code Online (Sandbox Code Playgroud)
还,
>>> id(result)
4482830576
>>> id(thing_called_cursor)
4482830576
Run Code Online (Sandbox Code Playgroud)
我可以尝试查看来源,但我宁愿不依赖我在那里找到的任何东西。也许最好忽略当前返回的任何内容,Cursor.execute因为这样做最符合 PEP 中的规范?
我正在尝试连接我的访问数据库,以便将数据转储到数据库中的表中.这是我使用的代码:
import pyodbc
access_database_file = "C:\\Users\\Moyp\\DataPointe.accdb"
ODBC_CONN_STR = 'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=%s;' %access_database_file
conn = pyodbc.connect(ODBC_CONN_STR)
Run Code Online (Sandbox Code Playgroud)
但是,我一直收到这个错误:
Traceback (most recent call last):
File "C:\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 3035, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-6-a4daec7c49a9>", line 1, in <module>
conn = pyodbc.connect(ODBC_CONN_STR)
Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
Run Code Online (Sandbox Code Playgroud) 我正在使用 sqlalchemy/pyodbc 连接到 MS SQL 2012 服务器。我选择了 sqlalchemy,因为它使用.read_sql和与熊猫数据框直接集成.to_sql。
在高层次上,我的代码是:
df = dataframe.read_sql("EXEC sp_getsomedata")
<do some stuff here>
finaldf.to_sql("loader_table", engine,...)
Run Code Online (Sandbox Code Playgroud)
这部分很好用,很容易阅读等等。问题是我必须运行一个最终存储过程来将加载器表中的数据插入到实时表中。通常,sqlalchemy 知道在 INSERT/UPDATE/DELETE 之后提交,但是当我运行这个最终存储过程时不想为我做提交。
在尝试了多种方法后,我看到 db 中的事务未提交。我知道 sqlalchemy 非常灵活,我使用了大约 3% 的功能,最简单的方法是什么?我想我需要使用 sqlalchemy 核心而不是 ORM。我看到了使用 sessionmaker 的例子,但我认为它垄断了引擎对象并且不允许熊猫访问它。
connection = engine.connect()
transaction = connection.begin()
connection.execute("EXEC sp_doLoaderStuff")
transaction.commit()
connection.close()
Run Code Online (Sandbox Code Playgroud)
我曾尝试.execute从连接级别调用,从游标级别调用,甚至使用该.raw_connection()方法都没有成功。
connection = engine.raw_connection()
connection.autocommit = True
cursor = connection.cursor()
cursor.execute("EXEC sp_doLoaderStuff")
connection.commit()
connection.close()
Run Code Online (Sandbox Code Playgroud)
任何想法我在这里缺少什么?
有谁知道如何从 python 建立到 Apache 钻的连接?
通常,通过 pyodbc 库的连接是这样的:
connection = pyodbc.connect(connectionString)
Run Code Online (Sandbox Code Playgroud)
连接字符串的格式通常为“DSN = *; UID = * ; PWD = ***”。我只是不确定如何在此处设置连接字符串。
谢谢!
我正在使用 PyODBC 通过名为 cnxn 的连接连接到 Oracle。
我有一个唯一标识符列表: list1 = [1234, 2345, 3456, 4567]
我也有一个疑问:
query1 = """
select * from tablename where unique_id = ?
""'
Run Code Online (Sandbox Code Playgroud)
我想要做的是使用这个标识符列表来创建一个熊猫数据框。
作为测试,我这样做了:
testid = "1234" (since Oracle wants a string as that id not an integer)
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时:
pd.read_sql(query1, cnxn, params = testid)
Run Code Online (Sandbox Code Playgroud)
我得到“sql 包含 1 个参数标记,但提供了 4 个。”
最终,我希望能够做这样的事情:
for i in list1:
newdataframe.append(pd.read_sql(query1, cnxn, params = i))
Run Code Online (Sandbox Code Playgroud)
并让它吐出一个数据框。
我已经阅读了 PyODBC 上的文档,看起来它指定了 ? 作为参数。我也看过这个问题,它很相似,但我需要能够将结果输入到 Pandas 数据框中以进行进一步操作。
我想如果我能让 testid 工作,我就会走上正轨。
谢谢
当我尝试使用cursor.primaryKeys("tablename")then 时发生异常:
Error: ('IM001', '[IM001] [Microsoft][ODBC Driver Manager] Driver does not support this function (0) (SQLPrimaryKeys)')
list(cursor.columns(table='tablename')) 也不显示主键。
我有一个使用 Python 脚本和 Pyodbc 模块调用的存储过程。代码如下所示:
import pyodbc
pyodbc.pooling=False
oConnexion = pyodbc.connect("driver={Teradata};dbcname=myServer;DefaultDatabase=myDB;uid=myUser;pwd=myPassword;charset=utf8;", autocommit=True)
oConnexion.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
oConnexion.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
oConnexion.setencoding(encoding='utf-8')
oCursor = oConnexion.cursor()
oQueryRegisterBatch = "CALL DEV_AUDIT.SP_AUDIT_BATCH('ED_DATA_QUALITY_MANUAL', 'REGISTER', '1900-01-01 00:00:00.000000', '2999-12-31 00:00:00.000000');"
oCursor.execute(oQueryRegisterBatch)
for row in oCursor:
print (row)
Run Code Online (Sandbox Code Playgroud)
存储过程创建一个新记录并返回记录 ID (BATCH_KEY)。当我在 Teradata 中执行存储过程时,它会正确返回 BATCH_KEY,但我无法在 Python 中捕获它。我收到以下错误消息而不是值:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
pyodbc.ProgrammingError: No results. Previous SQL was not a query.
Run Code Online (Sandbox Code Playgroud)
我可以在调用存储过程后通过查询表来检索 BATCH_KEY,但我想避免。您能否建议如何捕获存储过程的输出?
谢谢
import pyodbc
sql = 'CREATE TABLE TestTable (TestID int, TestDate datetime)'
con = pyodbc.connect(SQL Data WareHouse)
con.execute(sql)
con.commit()
con.close()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Traceback (most recent call last):
File "sqlTest.py", line 24, in <module>
con.execute(sql)
pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]111212;Operation cannot be performed within a transaction. (111212) (SQLExecDirectW)')
Run Code Online (Sandbox Code Playgroud)
我检查了我可以通过上面的代码使用INSERT和DELETE查询,但我不能使用CREATE和TRUNCATE查询。我检查有许可CREATE和TRUNCATE使用SSMS了。
是否可以在 Azure SQL 数据仓库中使用 pyodbc 创建表?
嗨,我目前在Python 3中使用pyodbc,并且试图通过无需在不同计算机上进行手动更改而自动检测ODBC驱动程序的方法。原因是因为我的计算机具有ODBC驱动程序13,而另一位朋友的计算机具有ODBC驱动程序11,因此无论何时从侧面运行脚本,都必须先手动更改版本才能执行该过程。
谁能帮助解决这个问题?以下是我的示例代码。
谢谢
import os
import csv
import pyodbc
import datetime
from dateutil.relativedelta import relativedelta
conn = pyodbc.connect(
r'DRIVER={ODBC Driver 13 for SQL Server};'
r'SERVER=****;'
r'DATABASE=****;'
r'Trusted_Connection=yes;'
)
cursor = conn.cursor()
cursor.execute("Select * From Table1")
dData = cursor.fetchall()
Run Code Online (Sandbox Code Playgroud) pyodbc ×10
python ×9
odbc ×3
sql-server ×3
ms-access ×2
python-3.x ×2
sql ×2
apache-drill ×1
azure ×1
database ×1
output ×1
pandas ×1
sqlalchemy ×1
teradata ×1