我的 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。
如何检查psycopg2连接上的打开事务?我打算将它添加到我的单元/功能测试中,因为 Python 的 DB API 使用隐式事务。
为了连接 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]。
在执行的游标上调用fetchall时,Python DB API返回元组列表.如果您使用_mysql模块,fetch_row有一个how参数,允许获取字典而不是元组.如何用光标实现同样的效果?
如何使用Python的DB API列出数据库表?
如果做不到,还有另外一种方法吗?
谢谢
我正在研究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) 我有一个数据库模式,可以在各种不同的数据库引擎中实现(假设我将使用 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的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 脚本。在 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
当我们使用 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-db-api ×10
python ×9
psycopg2 ×3
postgresql ×2
clickhouse ×1
cursor ×1
database ×1
django ×1
exception ×1
mysql ×1
sql ×1
sql-server ×1
sqlalchemy ×1
sqlite ×1
transactions ×1