标签: python-db-api

Django 中的游标是否在打开的事务中运行?

我的 Django 应用程序正在使用一些自定义 SQL,我在这样的视图中执行:

db = router.db_for_write(model)
cursor = connections[db].cursor()
cursor.execute("INSERT INTO ....")
Run Code Online (Sandbox Code Playgroud)

由于我使用的是TransactionMiddleware,因此我的视图在事务中运行,但我不清楚获取像这样的新游标是否“转义”了当前打开的事务,或者游标是否仍然是打开事务的一部分。我收到一些错误消息,使我相信游标正在事务中运行。

我希望能够使用游标在由TransactionMiddleware. 这可能吗?

如果重要的话,我正在运行带有 PostgreSQL 8.4 数据库的 Django 1.4。

python sql django postgresql python-db-api

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

如何在 psycopg2 连接上检查打开的事务?

如何检查psycopg2连接上的打开事务?我打算将它添加到我的单元/功能测试中,因为 Python 的 DB API 使用隐式事务。

python postgresql transactions psycopg2 python-db-api

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

Amazon Redshift 的 JDBC 驱动程序与 Python 适配器之间的区别

为了连接 Amazon Redshift,我使用 pythonpsycopg2模块将数据集注入到 Amazon Redshift 上,并且运行良好。只是提一下,我使用 Redshift 的端点 URL 通过psycopg2下面使用 python DB API v2.0 的连接进行连接。Amazon Redshift 还提供 JDBC 或 ODBC URL 进行连接,但我没有使用它。

伪代码:

import psycopg2
try:
    connection = psycopg2.connect(user = "redshift_user",
                                  password = "redshift_password",
                                  host = "redshift_endpoint",
                                  port = "5432",
                                  database = "redshift_database")

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

注意:我还使用 Redshift 的相同端点从不同的客户端(例如 Tableau、Navicat Premium 或在其下使用 JDBC/ODBC 驱动程序的其他 SQL 客户端)连接它。

但最近亚马逊给我发了关于 JDBC 驱动程序更新的消息,

AWS Redshift 发现 Redshift JDBC 驱动程序中存在导致服务器意外重启的问题,该问题随后在最新的 Redshift JDBC 驱动程序中得到修复。US-WEST-2 区域中的一些集群正在注册来自旧版本 JDBC 驱动程序的连接,可能会受到此问题的影响。

请将您的驱动程序升级到最新版本:1.2.36.1060,可供下载[1]。

[1] https://docs.aws.amazon.com/redshift/latest/mgmt/configure-jdbc-connection.html#download-jdbc-driver …

psycopg2 amazon-web-services python-db-api amazon-redshift

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

MySQL python DBAPI.如何获得字典而不是元组?

在执行的游标上调用fetchall时,Python DB API返回元组列表.如果您使用_mysql模块,fetch_row有一个how参数,允许获取字典而不是元组.如何用光标实现同样的效果?

python mysql python-db-api

5
推荐指数
1
解决办法
757
查看次数

Python DB API列表表

如何使用Python的DB API列出数据库表?

如果做不到,还有另外一种方法吗?

谢谢

python database python-db-api

5
推荐指数
1
解决办法
1869
查看次数

Pyscopg DB - 错误为代码添加持久性

我正在研究Udacity的在线项目.我正在使用vagrant他们配置,运行包含数据库的服务器.不幸的是,当我试图给出代码持久性时,服务器每次都会返回一个错误.我是python的新手所以请原谅任何明显的错误.

这是错误:

Serving HTTP on port 8000...
Traceback (most recent call last):
  File "/usr/lib/python2.7/wsgiref/handlers.py", line 85, in run
    self.result = application(self.environ, self.start_response)
  File "forum.py", line 95, in Dispatcher
    return DISPATCH[page](env, resp)
  File "forum.py", line 68, in Post
    length = int(env.get('CONTENT_LENGTH', 0))
ValueError: invalid literal for int() with base 10: ''
10.0.2.2 - - [06/Jan/2016 04:44:16] "GET /post HTTP/1.1" 500 59
10.0.2.2 - - [06/Jan/2016 04:44:16] "GET /favicon.ico HTTP/1.1" 404 22
Run Code Online (Sandbox Code Playgroud)

这是我在forumdb.py中更改的代码:

#
# Database …
Run Code Online (Sandbox Code Playgroud)

python psycopg2 python-db-api

5
推荐指数
1
解决办法
172
查看次数

一般捕获 python DatabaseErrors

我有一个数据库模式,可以在各种不同的数据库引擎中实现(假设我将使用 pyodbc 连接到 MS Access 数据库,或者我将通过内置 sqlite3 模块作为 SQLite 数据库连接到该数据库)简单的例子)。

我想创建一个工厂函数/方法,它根据某些参数返回适当类型的数据库连接,类似于以下内容:

def createConnection(connType, params):
    if connType == 'sqlite':
        return sqlite3.connect(params['filename'])
    elif connType == 'msaccess':
        return pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ={};'.format(params['filename']))
    else:
        # do something else
Run Code Online (Sandbox Code Playgroud)

现在我已经有了一些应该适用于任何连接类型的查询代码(因为无论底层数据库引擎如何,架构都是相同的),但可能会抛出一个我需要捕获的异常:

db = createDatabase(params['dbType'], params)

cursor = db.cursor()

try:
    cursor.execute('SELECT A, B, C FROM TABLE')
    for row in cursor:
        print('{},{},{}'.format(row.A, row.B, row.C))

except DatabaseError as err:
    # Do something...
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是每个 DB API 2.0 实现中的 DatabaseError 类不共享公共基类(除了过于通用的 Exception 之外),因此我不知道如何一般地捕获这些异常。显然我可以做如下的事情:

try:
    # as before
except sqlite3.DatabaseError as …
Run Code Online (Sandbox Code Playgroud)

python exception python-db-api

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

为什么在Python中关闭Sqlite3的游标

使用Python的sqlite3模块时关闭游标有什么好处吗?或者它只是DB API v2.0的工件,它可能只对其他数据库有用吗?

connection.close()释放资源是有道理的; 但是,目前还不清楚cursor.close()实际上是做什么的,无论它是实际释放某些资源还是什么都不做.它的文档是不明智的:

>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> c = conn.cursor()
>>> help(c.close)
Help on built-in function close:

close(...)
    Closes the cursor.
Run Code Online (Sandbox Code Playgroud)

注意,这是一个完全不同的问题,为什么在查询sqlite数据库时需要创建游标?.我知道游标的用途.问题是关于cursor.close()方法实际执行的操作以及调用它是否有任何好处.

python sqlite cursor python-internals python-db-api

5
推荐指数
1
解决办法
1087
查看次数

Python调用带有表值参数的sql-server存储过程

我有一个加载、转换和计算数据的 python 脚本。在 sql-server 中有一个存储过程,它需要一个表值参数、2 个必需参数和 2 个可选参数。在 sql server 中,我可以调用这个 SP:

USE [InstName]
GO

DECLARE @return_value int
DECLARE @MergeOnColumn core.MatchColumnTable

INSERT INTO @MergeOnColumn
SELECT 'foo.ExternalInput','bar.ExternalInput'

EXEC    @return_value = [core].[_TableData]
        @Target = N'[dbname].[tablename1]',
        @Source = N'[dbname].[table2]',
        @MergeOnColumn  = @MergeOnColumn,
        @Opt1Param = False,
        @Opt2Param = False

SELECT  'Return Value' = @return_value

GO
Run Code Online (Sandbox Code Playgroud)

经过全面搜索,我找到了以下帖子:

如何使用需要用户定义类型表参数的 SQLAlchemy 调用存储过程

它建议使用 PYTDS 和 sql-alchemy 的方言“sql alchemy pytds”来调用具有表值参数的 SP。通过这篇文章和文档,我创建了以下 Python 脚本:

import pandas as pd
import pytds
from pytds import login
import sqlalchemy as sa
from …
Run Code Online (Sandbox Code Playgroud)

python sql-server sqlalchemy table-valued-parameters python-db-api

5
推荐指数
1
解决办法
5648
查看次数

如何使用 clickhouse-driver (python) 从字典/名称元组中的 Clickhouse 获取数据?

当我们使用 DB API 2.0 获取数据时,cur.execute("select * from db.table")我们会得到一个游标,它看起来像元组列表的生成器对象。

而在 pymongo 中,当我们获取时,我们将其作为字典列表获取。我想实现这样的目标。

我不需要获取元组列表,而是想要字典列表或命名元组。

我相信从效率的角度来看这是有意义的,因为模式已经定义,所以不需要为每条记录发送它。

目前我正在使用的解决方法是:

cur.execute("select * from db.table")
columns = cur.columns_with_types
data = cur.fetchall()
df = pd.DataFrame(data,columns=[tuple[0] for tuple in columns])
data_reqd = df.to_dict('records')
Run Code Online (Sandbox Code Playgroud)

当查询返回大量数据时,此方法的公平性很差。

解决方法 1:使用fetchmany(size=block_size),但它似乎不是一种优雅的做事方式。

解决方法 2:这似乎是一种更好的处理方式。

cur.execute("select * from db.table")
columns = cur.columns_with_types
for tup in cur:
     row = dict(zip(columns, tup))
    # use row

Run Code Online (Sandbox Code Playgroud)

有什么好的办法处理这个问题吗?对问题的任何改进表示赞赏。

python memory-efficient python-db-api clickhouse

5
推荐指数
1
解决办法
2350
查看次数