问题标签 [python-db-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
208 浏览

python - Python 数据库 API v2 > 如果在迭代期间执行的查询没有返回结果,则对结果集的迭代停止

我在一个脚本中使用适用于 Python 的 Snowflake 连接器(它实现了对 Python 数据库 API v2 规范的支持),该脚本从一个表中提取许多记录,迭代结果集,并且对于返回的每一行,查询另一个表可能会或可能不会返回任何结果。

如果第二个查询没有返回任何结果,则对第一个查询返回的结果的迭代将停止,即使没有引发错误。

以下代码演示了我遇到的问题......

如果抛出异常,我可以通过捕获错误并继续下一个结果来处理这种情况。鉴于没有抛出异常,如何处理这种情况?

0 投票
1 回答
3931 浏览

python - Python 异步事务 psycopg2

可以使用 psycopg2 进行异步 i/o(可以在此处阅读)但是我不确定如何进行异步事务。考虑这一系列的事情:

  • 绿色线程 1 启动事务 T
  • GT1问题更新
  • GT2 发布一个事务性更新
  • GT1问题更新
  • GT1 提交事务 T

我假设 GT1 更新与 GT2 更新冲突。

现在根据文档

从同一连接创建的游标不是孤立的,即游标对数据库所做的任何更改都可以立即被其他游标看到。

所以我们不能在游标上实现上面的流程。我们可以在不同的连接上实现它,但是由于我们正在执行异步操作,因此产生(可能)数千个数据库连接可能会很糟糕(更不用说 Postgres 无法处理这么多的开箱即用)。

另一种选择是拥有一个连接池并重用它们。但是,如果我们发出 X 个并行事务,则所有其他绿色线程都会被阻塞,直到某个连接可用。因此,有用的绿色线程的实际数量是 ~X(假设应用程序受数据库严重限制),这引发了一个问题:我们为什么要使用 async 开始?

现在这个问题实际上可以推广到 DB API 2.0。也许真正的答案是 DB API 2.0 不适合异步编程?那么我们将如何在 Postgresql 上执行异步 io 呢?也许其他一些图书馆?

或者可能是因为 postgresql 协议实际上是同步的?能够在任何时间(每个连接)“写入”任何事务将是完美的。Postgresql 必须为此公开事务的 id。可行吗?也许两阶段提交是答案?

或者我在这里错过了什么?

编辑:这似乎是 SQL 的一个普遍问题,因为BEGIN; COMMIT;语义不能有效地异步使用。

0 投票
3 回答
2932 浏览

python - 使用python3将numpy整数类型插入sqlite

在python 3中将numpy整数对象的值插入数据库的正确方法是什么?在 python 2.7 中,numpy 数字数据类型干净地插入到 sqlite 中,但它们在 python 3 中没有

np.float 类型在 2 和 3 中似乎仍然可以正常工作。

在 python 2 中,numpy 标量整数数据类型不再是 int 的实例,甚至将整数值浮点数转换为 int。

这就是 dbapi 不再与 numpy 无缝协作的原因吗?

0 投票
1 回答
9390 浏览

python - 一般捕获python DatabaseErrors

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

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

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

我遇到的问题是每个 DB API 2.0 实现中的 DatabaseError 类不共享一个公共基类(除了过于通用的异常),所以我不知道如何一般地捕获这些异常。显然,我可以执行以下操作:

...我为每个可能的数据库引擎包含了一个显式的 catch 块。但这对我来说似乎显然不是pythonic。

如何从不同的底层 DB API 2.0 数据库实现中捕获 DatabaseErrors?

0 投票
1 回答
2383 浏览

python - 为什么需要 teardown_appcontext 来关闭数据库连接?

根据flask docs,当应用上下文崩溃时,我们应该关闭数据库连接:

但是应用程序上下文的拆除不会删除(唯一)对数据库连接的引用(g.sqlite_db消失时g消失)吗?我认为这会自动关闭连接(因为数据库驱动程序会关闭连接del)。显式关闭连接有什么好处?

0 投票
1 回答
96 浏览

python - Python DB-Api 何时提交多个插入/更新

我有一个函数可以更新 db 中的单行。

是否可以多次(几千次)使用此功能并在conn.commit()之后执行,如下所示:

或者我应该通过而curr不是connupdate_one_row

我知道curr.executemany(),但我更喜欢显式循环。有性能差异吗?

总的来说,我对游标的使用和何时提交非常迷茫。

0 投票
1 回答
772 浏览

sqlite - 更新时创建 Sqlite 数据库补丁

上下文: python 3.6 脚本每天使用sqlite3模块
多次更新 Sqlite 数据库。 数据库是~500Mo,每次更新加起来~250Ko。

问题:
我提供数据库的每个更新版本,并希望减少传输数据的大小。换句话说,我只想传输更新的内容(通过一种补丁)。
可以使用sqldiff.exe实用程序,但是,每次更新时它都需要创建数据库的本地副本。

问题:
有没有办法,使用Python(通过DB-API 2.0接口或使用Python中的其他方式),在更新数据库的同时生成这种补丁?


第一个想法:在执行提交之前/期间是否可以根据游标
编写补丁(例如更新数据库要执行的操作列表)?

0 投票
1 回答
7338 浏览

python - 当我迭代游标时,psycopg2 在做什么?

我试图了解这段代码在幕后做了什么:

根据PEP 249,我的理解是,这是重复调用Cursor.next(),相当于调用Cursor.fetchone()。但是,psycopg2文档说以下内容

当执行数据库查询时,Psycopg 游标通常会获取后端返回的所有记录,并将它们传输到客户端进程。

所以我很困惑——当我运行上面的代码时,它是将结果存储在服务器上并一个一个地获取它们,还是一次把所有的东西都带过来?

0 投票
2 回答
1265 浏览

python - ValueError: 操作参数必须是 str

我正在尝试使用 python 函数将一些数据库字段更新到 SQLite DB。我不断收到以下错误:

ValueError: 操作参数必须是 str

下面是我的代码。我很想知道如何更新 sqlite 数据库中的多个列。

0 投票
2 回答
1325 浏览

python - 如何从熊猫数据框更新ms访问中的多行

我正在尝试从 pandas 数据框中的列执行此更新查询:

查询未执行且未显示错误。

我的数据框如下所示:

数据表截图