标签: pyodbc

用pyodbc进行Python多处理和数据库访问"不安全"?

问题:

我得到以下回溯,并不明白它的含义或如何解决它:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python26\lib\multiprocessing\forking.py", line 342, in main
    self = load(from_parent)
  File "C:\Python26\lib\pickle.py", line 1370, in load
    return Unpickler(file).load()
  File "C:\Python26\lib\pickle.py", line 858, in load
    dispatch[key](self)
  File "C:\Python26\lib\pickle.py", line 1083, in load_newobj
    obj = cls.__new__(cls, *args)
TypeError: object.__new__(pyodbc.Cursor) is not safe, use pyodbc.Cursor.__new__()
Run Code Online (Sandbox Code Playgroud)

情况:

我有一个SQL Server数据库,里面装满了要处理的数据.我正在尝试使用多处理模块来并行化工作并利用计算机上的多个核心.我的一般类结构如下:

  • MyManagerClass
    • 这是程序启动的主类.
    • 它创建了两个multiprocessing.Queue对象,一个work_queue和一个write_queue
    • 它还创建并启动其他进程,然后等待它们完成.
    • 注意:这不是 multiprocessing.managers.BaseManager()的扩展.
  • MyReaderClass
    • 此类从SQL Server数据库中读取数据.
    • 它将物品放入work_queue.
  • MyWorkerClass
    • 这是工作处理发生的地方.
    • 它从中获取项目work_queue并将完成的项目放入write_queue. …

python sql-server pickle multiprocessing pyodbc

12
推荐指数
1
解决办法
5137
查看次数

并行化pandas pyodbc SQL数据库调用

我目前正在通过pandas.io.sql.read_sql()命令将数据查询到数据帧中.我希望并行调用类似于这些人所倡导的调用:(使用Python进行令人尴尬的并行数据库调用(PyData Paris 2015))

像(很一般)的东西:

pools = [ThreadedConnectionPool(1,20,dsn=d) for d in dsns]
connections = [pool.getconn() for pool in pools]
parallel_connection = ParallelConnection(connections)
pandas_cursor = parallel_connection.cursor()
pandas_cursor.execute(my_query)
Run Code Online (Sandbox Code Playgroud)

有可能吗?

python sql multithreading pyodbc pandas

12
推荐指数
1
解决办法
2114
查看次数

如果没有设置__version__变量,如何检查python包的版本

我正在使用pyodbc,我想知道我正在使用它的版本.显然我不能使用,pyodbc.__version__因为可能没有设置变量.

我怎么能弄清楚包的版本?

python pip pyodbc

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

使用pyodbc将docker python连接到SQL服务器

我正在尝试连接在docker容器中运行的pyodbc python脚本以登录到MSSQL数据库我已经尝试了各种docker文件,但是无法建立连接(在构建docker或python尝试连接时失败),有没有人有一个工作的dockerfile,使用pyodbc:

Dockerfile:

# Use an official Python runtime as a parent image
FROM python:2.7-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
ADD . /app

# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt

# Run app.py when the container launches
CMD ["python", "App.py"]
Run Code Online (Sandbox Code Playgroud)

requirements.TXT

pyodbc
Run Code Online (Sandbox Code Playgroud)

App.Py

import pyodbc

connection = pyodbc.connect('Driver={SQL Server};'
                            'Server=xxxx;'
                            'Database=xxx;'
                            'UID=xxxx;'
                            'PWD=xxxx')

cursor = connection.cursor()

cursor.execute("SELECT [Id],[Name] FROM …
Run Code Online (Sandbox Code Playgroud)

pyodbc docker dockerfile

12
推荐指数
6
解决办法
8340
查看次数

无法在 Windows 10 中使用 python 3.10 安装 pyodbc

当我尝试安装 Pyodbc 时出现此错误,我已经安装了 Visual Studio 并且我的计算机中安装了 Microsoft Visual C++ 12 、 15-19 ,但仍然出现此错误。

Running setup.py clean for pyodbc
Failed to build pyodbc
Installing collected packages: sqlparse, pytz, asgiref, pyodbc, Django, Pillow, mssql-django, django-crispy-forms
    Running setup.py install for pyodbc ... error
    ERROR: Command errored out with exit status 1:
     command: 'C:\Users\Athar\Desktop\New folder\Project\HeatlhCare\venv\Scripts\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\Athar\\AppData\\Local\\Temp\\pip-install-w0wwm18g\\pyodbc_61963e883a8543fea24a63b1c522bbea\\setup.py'"'"'; __file__='"'"'C:\\Users\\Athar\\AppData\\Local\\Temp\\pip-install-w0wwm18g\\pyodbc_61963e883a8543fea24a63b1c522bbea\\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' …
Run Code Online (Sandbox Code Playgroud)

django odbc pyodbc python-3.x

12
推荐指数
1
解决办法
3万
查看次数

在PyOdbc中获取表和列名称

我想从PyOdbc Cursor中检索完全引用的列名.例如,假设我有2个简单的表格:

  • Table_1(Id, < some other fields >)
  • Table_2(Id, < some other fields >)

我想要检索已连接的数据

select * from Table_1 t1, Table2 t2 where t1.Id = t2.Id
Run Code Online (Sandbox Code Playgroud)

使用pyodbc,像这样:

query = 'select * from Table_1 t1, Table2 t2 where t1.Id = t2.Id'

import pyodbc
conn_string = '<removed>'
connection =  pyodbc.connect(conn_string)

cursor = connection.cursor()cursor.execute(query)
Run Code Online (Sandbox Code Playgroud)

然后我想获得列名:

for row in cursor.description:
    print row[0]
Run Code Online (Sandbox Code Playgroud)

但如果我这样做,我会得到Id两次我不想要的.理想情况下,我能得到t1.Id并且t2.Id在输出中.

我想到的一些解决方案(以及为什么我真的不想实现它们):

  1. 重新命名查询中的列 - 在我的实际用例中有几十个表,其中一些表有几十行经常更改
  2. 解析我的查询并自动生成我的SQL查询(基本上检查表的查询,使用cursor.tables函数获取列,然后用select *一组命名列替换) - 如果我也有,我会这样做,但是对于测试工具来说似乎有些过分

有没有更好的办法?任何意见,将不胜感激.

python pyodbc

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

是否可以让SQL Server将排序规则转换为UTF-8/UTF-16

在我正在处理的项目中,我的数据存储在SQL Server中,并带有排序规则Danish_Norwegian_CI_AS.数据通过FreeTDS和ODBC输出到python,处理数据为UTF-8.一些字符,如å,ø和æ,没有被正确编码,导致项目进展停滞不前.

我花了几个小时阅读有关令人困惑的编码,校对和代码页的世界,感觉我已经对整个画面有了更好的理解.

我读过的一些文章让我觉得有可能:在SQL select语句中指定,在输出时,校对数据应编码为UTF-8.

我认为这是可能的原因是这篇文章展示了一个如何获得具有不同排序规则的表格以便一起玩的例子.

任何指向将校对转换为UTF-8/UTF-16的方向,都将非常感谢!

编辑:我已经读过,SQL Server提供了一个unicode选项nchar,nvarcharntext,以及其他字符串变量char,varchartext根据set collat​​ion进行编码.我还读到上面提到的unicode选项是用utf-16变体ucs-2编写的(我希望我记得正确).所以; 为了允许locale collat​​ion和unicode表,玩得好,应该有转换函数,不是吗?

sql-server unicode collation utf-8 pyodbc

11
推荐指数
2
解决办法
4万
查看次数

pyodbc.connect()有效,但不是sqlalchemy.create_engine().connect()

我正在尝试编写一个Python脚本,可以将Excel工作表导入我的SQL Server Express(带有Windows身份验证)数据库作为表.为此,我pandas用来将Excel文件读入a pandas DataFrame,然后希望用来pandas.to_sql()将数据导入我的数据库.但是,要使用此功能,我需要使用sqlalchemy.create_engine().

我可以pyodbc单独使用连接到我的数据库,并运行测试查询.这个连接使用以下代码完成:

def create_connection(server_name, database_name):
    config = dict(server=server_name, database= database_name)

    conn_str = ('SERVER={server};DATABASE={database};TRUSTED_CONNECTION=yes')

    return pyodbc.connect(r'DRIVER={ODBC Driver 13 for SQL Server};' + conn_str.format(**config))

...

server = '<MY_SERVER_NAME>\SQLEXPRESS'
db = '<MY_DATABASE_NAME>

connection = create_connection(server, db)
cursor = connection.cursor()
cursor.execute('CREATE VIEW test_view AS SELECT * FROM existing_table')
cursor.commit()
Run Code Online (Sandbox Code Playgroud)

然而,由于我不能使用这个并没有多大用处pandas.to_sql()- 这样做我需要一个引擎sqlalchemy.create_engine(),但是我很难弄清楚如何在我create_connection()上面的函数中使用我的相同细节来成功创建引擎并连接到数据库.

我尝试了许多很多组合:

engine = create_engine("mssql+pyodbc://@C<MY_SERVER_NAME>\SQLEXPRESS/<MY_DATABASE_NAME>?driver={ODBC Driver 13 for SQL Server}?trusted_connection=yes")
conn = engine.connect().connection
Run Code Online (Sandbox Code Playgroud)

要么

engine …
Run Code Online (Sandbox Code Playgroud)

python sql-server sqlalchemy pyodbc pandas

11
推荐指数
1
解决办法
4564
查看次数

使用pyodbc 3.07连接MySQL 3.23

我正在尝试使用UnixODBC和pyodbc 3.07从Ubuntu 16客户端连接到旧的MySQL 3.23服务器.我尝试了三个(3)版本的MySQL Connector/ODBC和两个(2)来自MariaDB:

MySQL-ODBC 5.3.9仅支持新的mysql身份验证方法.因此无法连接.

MySQL-ODBC 5.1.13有一个用于身份验证方法的开关,但告诉我pyodbc.connect(dsn):[MySQL][ODBC 5.1 Driver]Driver does not support server versions under 4.1.1

MySQL-ODBC 3.51有两个问题:

  1. [MySQL][ODBC 3.51 Driver]Transactions are not enabled (4000) (SQLSetConnnectAttr(SQL_ATTR_AUTOCOMMIT))因为pyodbc将autocommit设置为false作为默认值而失败.
  2. 当我连接时给我一个连接pyodbc.connect(dsn, autocommit=True).连接给了我一个游标,但所有cursor.execute(sql)抛出异常('HY000', 'The driver did not supply an error!').

从shell中测试与isql的连接通过isql -v [dsn]给我一个会话但是在所有语句上失败[ISQL]ERROR: Could not SQLExecute.所以这似乎是一个unixodbc问题.

我安装了mysql-client.但是programm mysql无法连接服务器.

mariadb-client可以连接到数据库甚至执行语句.这看起来更有希望.

我下载了MariaDB ODBC-Driver 3.0.2.使用该驱动程序与isql返回错误:[S1000][unixODBC][ma-3.0.2]Plugin old_password could not be loaded: lib/mariadb/plugin/old_password.so: cannot open shared object …

mysql unixodbc pyodbc mariadb

11
推荐指数
1
解决办法
1538
查看次数

Python连接到Hive

我安装了Hortonworks Hive ODBC驱动程序并在数据源中创建了一个连接.我测试了它并且它成功地运行了.

我安装了PyODBC并编写了以下代码

import os, sys, pyodbc;
con = pyodbc.connect("DSN=MyCon")
Run Code Online (Sandbox Code Playgroud)

我收到了错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
pyodbc.Error: ('HYC00', '[HYC00] [Hortonworks][ODBC] (11470) Transactions are not supported. (11470) (SQLSetConnnectAttr(SQL_ATTR_AUTOCOMMIT))')
Run Code Online (Sandbox Code Playgroud)

我也试过了

import pyodbc, sys, os
pyodbc.pooling = False
pyodbc.autocommit = False
con = pyodbc.connect("DSN=MyCon")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
pyodbc.Error: ('HYC00', '[HYC00] [Hortonworks][ODBC] (11470) Transactions are not supported. (11470) (SQLSetConnnectAttr(SQL_ATTR_AUTOCOMMIT))')
Run Code Online (Sandbox Code Playgroud)

也试过了

con = pyodbc.connect("DSN=Tenet", autocommit=False)


Traceback (most recent call last): …
Run Code Online (Sandbox Code Playgroud)

python hadoop hive pyodbc

10
推荐指数
1
解决办法
8866
查看次数