我正在尝试使用pyodbc访问Ubuntu上的.mdb.到目前为止,我的进展基于此链接
我安装了pyodbc,unixodbc和unixodbc-dev
我的代码看起来像这样:
import csv
import pyodbc
MDB = 'URY.mdb'
DRV ='Microsoft Access Driver (*.mdb)'
PWD = 'pass'
conn = pyodbc.connect('DRIVER=%s;DBQ=%s;PWD=%s' % (DRV,MDB,PWD))
curs = conn.cursor()
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我收到此错误消息:
Traceback (most recent call last):
File "mdbscraper.py", line 8, in <module>
conn = pyodbc.connect('DRIVER=%s;DBQ=%s;PWD=%s' % (DRV,MDB,PWD))
pyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)')
Run Code Online (Sandbox Code Playgroud)
有没有人有任何想法?任何帮助将非常感谢
谢谢!
我经常收到这个错误: ProgrammingError: The cursor's connection has been closed.
在尝试执行查询之前,有没有办法检查我正在使用的连接是否已关闭?
我正在考虑编写一个包装器来执行查询.首先,它将检查连接是否关闭,如果是,它将重新连接.这是一种可行的方法吗?
我有一个postgresql数据库,其中包含drupal制作的一些表格,以及我自己制作的其他表格.然后我有一个使用pyodbc的python api来查询数据库.
只有一个表,我无法通过pyodbc选择.如果我打印查询并将其粘贴到pgadminIII中,那么它会给出预期的结果,如果我在python代码中更改了表,它会给出正确的结果.
查询是
select id from a_company where name = 'somename'
Run Code Online (Sandbox Code Playgroud)
结果
7
8
9
Run Code Online (Sandbox Code Playgroud)
等(50行int id)
我的python代码是
sql = """select id from a_company where name = 'somename'"""
curs = self._connection.cursor()
sql = self._ConvertToPostGres(sql) #drops [] etc, as the initial code was for MSSQL
curs.execute(sql)
f = curs.fetchall()
Run Code Online (Sandbox Code Playgroud)
通过pyodbc的调用返回
None
Run Code Online (Sandbox Code Playgroud)
(我可以使用相同的连接从其他表中进行选择,因此连接字符串无关紧要?)
我最好的猜测是这是一个权限问题,而且我已经用这个特定的表做了一些蠢事.
任何人都可以建议如何调试这个?
通过pgadmin创建表:
-- Table: a_company
-- DROP TABLE a_company;
CREATE TABLE a_company
(
id integer NOT NULL DEFAULT nextval('a_company_id_seq'::regclass),
name character varying,
abn character varying,
url character …Run Code Online (Sandbox Code Playgroud) 我有一个Python程序,使用ODBC连接连接到MSSQL数据库.我正在使用的Python库是pypyodbc.
这是我的设置:
我遇到的问题是,当我查询带有varchar(max)列的表时,内容被截断.
我是pypyodbc的新手,我一直在疯狂地搜索,并且找不到任何关于如何防止在pypyodbc甚至pyodbc中发生这种情况的事情.至少没有我一直在使用的搜索词,我不知道还有什么其他的短语可以尝试.
我甚至尝试添加SET TEXTSIZE 2147483647;到我的SQL查询,但数据仍然被截断.
我该如何防止这种情况发生?或者,你能指出我正确的方向吗?
更新:
所以,我尝试在我的SQL查询中执行强制转换.当我这样做CAST(my_column as VARCHAR(MAX))时截断在相同的位置.但是,如果我这样做CAST(my_column as VARCHAR(8000))会给我一个更大的文本集,但它仍然会截断一些内容.如果我尝试做任何比8000我更大的错误,说8000我是最大的,我可以使用.有人知道这里会发生什么吗?使用MAX不起作用似乎很奇怪.
我正在尝试将Pandas的DataFrame写入SQL Server表.这是我的例子:
import pyodbc
import pandas as pd
import sqlalchemy
df = pd.DataFrame({'MDN': [242342342] })
engine = sqlalchemy.create_engine('mssql://localhost/Sandbox?trusted_connection=yes')
df.to_sql('Test',engine, if_exists = 'append',index = False)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息.有关如何修复的任何想法?
c:\python34\lib\site-packages\sqlalchemy\connectors\pyodbc.py:82: SAWarning: No driver name specified; this is expected by PyODBC when using DSN-less connections
"No driver name specified; "
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-25-78677a18ce2d> in <module>()
4 engine = sqlalchemy.create_engine('mssql://localhost/Sandbox?trusted_connection=yes')
5
----> 6 df.to_sql('Test',engine, if_exists = 'append',index = False)
7
8 #cnxn.close()
c:\python34\lib\site-packages\pandas\core\generic.py in to_sql(self, name, con, flavor, schema, if_exists, index, …Run Code Online (Sandbox Code Playgroud) 我有一些代码可以将 Scrapy 抓取的数据写入 SQL 服务器数据库。数据项包括一些基本的酒店数据(名称、地址、评级...)和一些带有相关数据(价格、入住率等)的房间列表。可以有多个 celery 线程和多个服务器运行此代码并同时写入数据库不同的项目。我遇到死锁错误,例如:
[Failure instance: Traceback: <class 'pyodbc.ProgrammingError'>:
('42000', '[42000] [FreeTDS][SQL Server]Transaction (Process ID 62)
was deadlocked on lock resources with another process and has been
chosen as the deadlock victim. Rerun the transaction. (1205) (SQLParamData)')
Run Code Online (Sandbox Code Playgroud)
实际执行插入/更新的代码示意如下:
1) Check if hotel exists in hotels table, if it does update it, else insert it new.
Get the hotel id either way. This is done by `curs.execute(...)`
2) Python loop over the hotel rooms scraped. For each room …Run Code Online (Sandbox Code Playgroud) 我尝试将一堆数据插入数据库
insert_list = [(1,1,1,1,1,1),(2,2,2,2,2,2),(3,3,3,3,3,3),....] #up to 10000 tuples in this list
conn = pyodbc.connect('DRIVER={FreeTDS};SERVER=xxxxx;DATABASE=xxxx;UID=xx;PWD=xx;TDS_Version=7.0')
cursor = conn.cursor()
sql = "insert into ScanEMAxEMAHistoryDay(SecurityNumber, EMA1, EMA2, CrossType, DayCross, IsLocalMinMax) values (?, ?, ?, ?, ?, ?)"
cursor.executemany(sql, insert_list)
Run Code Online (Sandbox Code Playgroud)
cursor.executemany(sql,insert_list)
pyodbc.ProgrammingError:('参数类型无效.param-index = 4 param-type = numpy.int64','HY105')
减少到100元组:
cursor.executemany(sql, insert_list[:100])
Run Code Online (Sandbox Code Playgroud)
cursor.executemany(sql,insert_list [:100])
pyodbc.ProgrammingError:('参数类型无效.param-index = 4 param-type = numpy.int64','HY105')cursor.executemany(sql,insert_list [:100])
减少到5元组:
cursor.executemany(sql, insert_list[:5])
conn.commit()
Run Code Online (Sandbox Code Playgroud)
这可以插入数据库
我试着:
sql = 'SET GLOBAL max_allowed_packet=50*1024*1024'
cursor.execute(sql)
Run Code Online (Sandbox Code Playgroud)
在excutemany()之前,它有一个错误:
pyodbc.ProgrammingError:('42000',"[42000] [FreeTDS] [SQL Server]'GLOBAL'不是公认的SET选项.(195)(SQLExecDirectW)")
我是怎么解决这个问题的
谢谢.
我使用的是Python 3.6,pyodbc,并连接到SQL Server.
我正在尝试连接到数据库,然后创建带参数的查询.
这是代码:
import sys
import pyodbc
# connection parameters
nHost = 'host'
nBase = 'base'
nUser = 'user'
nPasw = 'pass'
# make connection start
def sqlconnect(nHost,nBase,nUser,nPasw):
try:
return pyodbc.connect('DRIVER={SQL Server};SERVER='+nHost+';DATABASE='+nBase+';UID='+nUser+';PWD='+nPasw)
print("connection successfull")
except:
print ("connection failed check authorization parameters")
con = sqlconnect(nHost,nBase,nUser,nPasw)
cursor = con.cursor()
# make connection stop
# if run WITHOUT parameters THEN everything is OK
ask = input ('Go WITHOUT parameters y/n ?')
if ask == 'y':
# SQL without parameters start
res …Run Code Online (Sandbox Code Playgroud) 我正在尝试pyodbc从运行Ubuntu 16.04的远程计算机连接到MS SQL Server 。
import pyodbc
conn = pyodbc.connect(r'DRIVER=ODBC Driver 17 for SQL Server; SERVER=xxxTest-SRV; PORT=51333; DATABASE=TestDB; UID=xxxx; PWD=xxxx;')
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
pyodbc.OperationalError:('HYT00','[HYT00] [unixODBC] [Microsoft] [SQL Server的ODBC驱动程序17]登录超时已过期(0)(SQLDriverConnect)')
我尝试IP在连接字符串中使用服务器,但还是没有运气。
但是,我可以sqlcmd从终端连接到使用
以下作品:
sqlcmd -S xxxTest-SRV, 51333 -d TestDB -U xxxx -P xxxx
Run Code Online (Sandbox Code Playgroud)
我没有找到任何可以解决我问题的问题。
odbcinst.ini
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-17.1.so.1.1
UsageCount=1
Run Code Online (Sandbox Code Playgroud)
pyodbc从Linux机器使用MS SQL Server连接似乎总是存在问题。有没有一种方法可以从Python连接到SQL Server。感谢您在解决此错误方面的帮助。谢谢。
[更新]
按照下面的答案,我更新了连接字符串。但是,现在我得到以下错误:
pyodbc.Error:('01000',“ [01000] [unixODBC] [驱动程序管理器]无法打开lib'/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.0.so.1.1':找不到文件(0) (SQLDriverConnect)“)
我的odbcinst.ini文件驱动程序定义:
[ODBC Driver 17 …Run Code Online (Sandbox Code Playgroud) 我试图运行一个选择查询来使用pyodbcpython 2.7 从SQL Server检索数据.我希望数据在列表中返回.我写的代码如下.
它有点工作,但不符合我的预期.我的返回列表如下所示:
Index Type Size Value
0 Row 1 Row object of pyodbc module
1 Row 1 Row object of pyodbc module
...
105 Row 1 Row object of pyodbc module
Run Code Online (Sandbox Code Playgroud)
我希望看到类似下面的内容(即我在SQL中的表)
ActionId AnnDate Name SaleValue
128929 2018-01-01 Bob 105.3
193329 2018-04-05 Bob 1006.98
...
23654 2018-11-21 Bob 103.32
Run Code Online (Sandbox Code Playgroud)
列表不是使用SQL查询返回数据的最佳方法pyodbc吗?
码
import pyodbc
def GetSQLData(dbName, query):
sPass = 'MyPassword'
sServer = 'MyServer\\SQL1'
uname = 'MyUser'
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
"Server=" …Run Code Online (Sandbox Code Playgroud) pyodbc ×10
python ×8
sql-server ×5
celery ×1
freetds ×1
list ×1
markers ×1
ms-access ×1
mysql ×1
numpy ×1
odbc ×1
pandas ×1
postgresql ×1
pypyodbc ×1
python-2.7 ×1
python-3.x ×1
scrapy ×1
sql ×1
sqlalchemy ×1
ubuntu ×1
ubuntu-16.04 ×1