问题标签 [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 投票
7 回答
54066 浏览

python-2.7 - 使用 Python sqlite3 进行交易

我正在尝试将一些代码移植到使用 sqlite 数据库的 Python,并且我正在尝试让事务正常工作,但我真的很困惑。我对此感到非常困惑;我在其他语言中使用过很多 sqlite,因为它很棒,但我根本无法弄清楚这里有什么问题。

这是我的测试数据库的架构(要输入 sqlite3 命令行工具)。

这是一个测试程序。

您可能会注意到其中的故意错误。这会导致 SQL 脚本在执行更新后在第二行失败。

根据文档,该with sql语句应该围绕内容建立一个隐式事务,只有在块成功时才会提交。但是,当我运行它时,我得到了预期的 SQL 错误...但是 i 的值从 99 设置为 1。我希望它保持在 99,因为应该回滚第一次更新。

这是另一个测试程序,它显式调用commit()rollback().

其行为方式完全相同 --- i 从 99 变为 1。

现在我明确地调用 BEGIN 和 COMMIT :

这也失败了,但方式不同。我明白了:

c.execute()但是,如果我替换对to的调用c.executescript(),那么它可以工作(我保持在 99)!

(我还应该补充一点,如果我将beginandcommit放在内部调用中,executescript那么它在所有情况下都会正确运行,但不幸的是我不能在我的应用程序中使用这种方法。此外,更改sql.isolation_level似乎对行为没有任何影响。 )

有人可以向我解释这里发生了什么吗?我需要了解这一点;如果我不能信任数据库中的事务,我就不能让我的应用程序工作......

Python 2.7、python-sqlite3 2.6.0、sqlite3 3.7.13、Debian。

0 投票
0 回答
300 浏览

python - Python DB API 2.0 模块和大型 BLOB 对象

我正在编写一个 python 脚本来将数据从任何 RDBMS 迁移到 MySQL。唯一的要求是源 RDBMS 必须具有Python DB API 2.0 模块,并且必须支持 SQL-89 标准中定义的基本 SELECT 语句。到目前为止,我唯一关心的是如何处理大型对象,例如大型 BLOBS。我知道处理它们的机制,如 使用 Python 将 blob 从 SQLite 写入文件中所述。

按照这种方式,你必须在内存中有这些大对象。当它们在百兆甚至千兆字节范围内时呢?有没有办法分块转移它们?源数据库中没有大对象不是可接受的约束(即我必须处理它们)。

预先感谢您对该主题的建议。

0 投票
0 回答
1177 浏览

python - 以独立于数据库的方式检查 Python DB 游标列类型

我必须将一些数据从各种数据库(目前是 Oracle 和 Postgre)转储到 CSV 文件中,同时保留列类型信息,以便可以将数据正确加载到另一个应用程序中。基本上,我需要编写一个函数,该函数可以以独立于所使用的特定 DBAPI 模块的方式将列数据中的字符串/数字数据与游标对象区分开来。

根据DB-API v2 文档,每个 DBAPI 模块必须定义类型对象(例如module.STRING),这些对象“必须比较等于”每列(例如cursor.description[n][1],对于第 n 列)的游标对象中的类型对象。

我遇到的问题是......如果我只能访问游标对象,我怎么能找出适合这个比较的类型对象是什么?如何从游标对象中获取相应 DBAPI 模块的句柄。有什么意见或建议吗?

到目前为止,我一直在使用丑陋的 kludge:

我想要一个更强大和优雅的解决方案。有什么意见或建议吗?

编辑:到目前为止我想出的最好的事情是使用以下几乎一样可怕的黑客来处理适当的模块:

0 投票
9 回答
163532 浏览

python - 如何检查结果集是否为空?

我有一个不返回任何命中的 sql 语句。例如,'select * from TAB where 1 = 2'

我想检查返回了多少行,

在这里我已经得到异常:“(0,'没有结果集')”

我怎样才能防止这个异常,检查结果集是否为空?

0 投票
1 回答
3015 浏览

python - 如何获取发送到数据库的准备好的查询

当使用实现Python 数据库 API 规范的pyodbc等数据库库时,如何在应用参数替换后获得完全准备好的查询。我正在调用一个 Sybase 存储过程,它将通过参数替换接收 18 个参数。我想捕获实际调用并将其记录下来以帮助调试。我需要的一个更简单的例子:

pyodbc 示例

预期的最终查询(待记录)

sqlite3 示例

我放了 sqlite3 示例,因为它不需要 pyodbc 来试用。

更新

似乎当使用准备好的语句时,将数据填充到模板中的过程是在 DBMS 中的服务器端完成的。如user581592's answer中所述,经常没有方法或api可以从服务器获取查询的最终版本。其他值得注意的链接是pyodbc 上的第 163 期,进一步讨论了这一点。此外,像 psycopg 这样的一些数据库库添加了一个mogrify方法,该方法将返回最终语句。但正如他们的文档中提到的,这不是 DB API 的一部分。

0 投票
0 回答
324 浏览

python - 我如何懒惰地将 csv 行传递给 executemany()?

我正在使用 MySQL Connector/Python 1.0.11 和 Python 3.3 和 MySQL 5.6.12 通过cursor.executemany ('INSERT INTO ... VALUES')将 csv 文件加载到表中。使用 sqlite3 或 psycopg2 我可以为 seq_of_parameters 传递一个 _csv.reader 对象,但 MySQL 失败并显示:

很公平,正如文档所说,它必须是一个序列,并且_csv.reader对象是一个枚举器(它定义了iternext),而不是一个序列。我显然可以通过'list(my_csv_reader)',但我很确定这并不懒惰,这些文件可以有 10^6+ 行。有没有办法懒惰地通过?还是我在浪费时间,因为 executemany() 会在执行 INSERT 之前扩展列表?(来自 cursor.py 的提示:“INSERT 语句通过批处理数据进行优化,即使用 MySQL 多行语法。”)也许类似于将迭代器包装在生成器中,ala http://www.logarithmic.net/ pfh/blog/01193268742。我非常期待你的想法!

0 投票
1 回答
147 浏览

python - 为 Cassandra 选择 python 客户端库

我之前使用过 Pycassa 并编写了一个包装器来使用批量突变和连接池等。但是http://wiki.apache.org/cassandra/ClientOptions现在建议使用基于 CQL 3 的 api,因为基于 Thrift 的 api (Pycassa) 将是仅支持向后兼容。Apache 站点建议使用由 DataStax 编写的 Python api,它仍处于 Beta 阶段(根据他们的文档)。从他们的 python-driver/README.rst 文件中查看警告

警告

此驱动程序目前正在大力开发中,因此包、模块、类和函数的 API 和布局可能会发生变化。也可能存在严重的bug,所以暂时不建议在生产环境中使用。

DataStax 站点http://www.datastax.com/download/clientdrivers建议使用 DB-API 2.0 和旧版 api。还有更多吗?有没有人比较基于 CQL 3 的 API?哪个脱颖而出?基于事实的答案将对社区有所帮助,因此请不要发表意见。

0 投票
1 回答
2052 浏览

python - Psycopg2 制作合适 mogrify?

我想完全按照cursor.mogrify生产的方式去做。

我正在更新一些通过连接字符串来构建查询的遗留 Python 代码。我需要改变它以安全逃生。

查询很长,并且构建在与运行不同的服务器上,因此cursor.execute出于代码清晰度和实际可行性的原因,使用转义的正常过程没有吸引力。

我会使用 mogrify,但我知道它仅用于调试目的。

我环顾四周,似乎无法找到一个好的答案。你有什么建议?

0 投票
1 回答
5373 浏览

python - Postgresql:如何从受日期约束的表中删除行?

我正在使用 psycopg2,如何删除早于某个日期的行?例如:

如果我这样写,就会出现 TypeError: 'datetime.date' object does not support indexing。我该怎么办?谢谢!

0 投票
1 回答
227 浏览

python-2.7 - 为什么 Python 的 Sqlite3 模块正确解析了这个参数替换的第一个实例,然后没有?缓存?

我有一个 Sqlite3 表,其中有一LastUpdated列包含格式为 UTC 的日期时间"2013-12-24 07:11:21",并且该表中的所有行都在 2 天前更新。

我想写一个SELECT语句来只返回一段时间没有更新的行:

我正在尝试使用 sqlite3 标准库从 Python 运行此查询,并且我希望过时的时间段是可变的。为了安全起见,我尝试使用sqlite3 标准库文档中提到的参数替换来使用变量stale_delta_parameter

dbcursor.execute("SELECT LastUpdated FROM UserToken WHERE TokenValid = 1 AND DATETIME(LastUpdated) < DATETIME('now', ?)", (stale_delta_parameter,))

我第一次运行它时,我设置stale_delta_parameter = '-4 days'并正确返回零行。然后我将值更改stale_delta_parameter为“-1 天”并运行查询。查询继续返回 0 行,而不是所有行的预期结果。

当我重新启动计算机时,查询似乎第一次运行良好,但同样,如果我使用一个 delta 值运行 python 脚本,一旦我更改了 delta 值,结果将继续是第一个实例的值运行查询。此外,如果我编写两个 SELECT 语句,其中设置了 query1'-4 days'应该不返回任何行,而 query2'-1 days'应该返回所有行,然后在运行脚本一次之后,我切换这些查询的值,查询的输出不会转变。

我认为这可能是不正确的 sql 查询,所以我尝试对 delta 进行硬编码并在 Sqlite3 shell 中运行查询。每次都按我的预期工作,所以查询没有错。

然后我尝试将变量stale_delta_parameter从扩展'-n days'DATETIME('now', '-n days')以防万一参数替换在 Sqlite 的特殊DATETIME()函数中无法正常工作。奇怪的行为没有改变。

在 Sqlite3 标准库或 Python DB-API 中是否发生了某种缓存,可能会阻止更新传递给底层数据库的查询?

我在文档中找不到任何东西,但这是我能想出的唯一符合这种行为的理论。

我试图找到一种方法来打印从 Python 传递给数据库的组装查询,因此我可以验证数据库没有获得查询的更新版本,但我找不到任何类型的打印方法的组装查询dbcursor.execute(...)

这是实际的代码: