【问题标题】:Python: convert buffer type of SQLITE column into stringPython:将 SQLITE 列的缓冲区类型转换为字符串
【发布时间】:2012-11-11 11:52:33
【问题描述】:

我是 Python 2.6 的新手。我一直在尝试在我的 Python 程序中取回 yyyy-mm-dd hh:m:ss 格式的日期 datetime 值。在 Python 中检查列类型时出现错误:'buffer' object has no attribute 'decode'。我想使用strptime() 函数来拆分日期数据并使用它,但我找不到如何将缓冲区转换为字符串。以下是我的代码示例(也可以使用here):

conn = sqlite3.connect("mrp.db.db", detect_types=sqlite3.PARSE_DECLTYPES)
cursor = conn.cursor()
qryT = """
    SELECT dateDefinitionTest FROM t
    WHERE IDproject = 4 AND IDstatus = 5
    ORDER BY priority, setDate DESC
"""
rec = (4,4)
cursor.execute(qryT,rec)
resultsetTasks = cursor.fetchall()
cursor.close()  # closing the resultset
for item in resultsetTasks:
    taskDetails = {}
    _f = item[10].decode("utf-8")

我得到的例外是:

'buffer' object has no attribute 'decode'

【问题讨论】:

  • 请显示您的代码和确切的错误。
  • pastie.org/5360165 dateDefinitionTestdatetime 的 sqlite3 字段
  • 我得到的错误:** 'buffer' 对象没有属性 'decode' **

标签: python sqlite python-2.6


【解决方案1】:

我不确定您的问题可能是什么。以下是您尝试实现的工作示例,希望对您有所帮助:

#!/usr/bin/env python

import datetime
import sqlite3

conn = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
cursor = conn.cursor()
cursor.execute("CREATE TABLE t (dateDefinitionTest DATETIME)")
cursor.execute("INSERT INTO t VALUES (?)", (datetime.datetime.now(),))
query = "SELECT dateDefinitionTest FROM t"
cursor.execute(query)
for row in cursor.fetchall():
    dt = datetime.datetime.strptime(row[0], "%Y-%m-%d %H:%M:%S.%f")
    print(repr(dt))
    print(dt.strftime("%Y-%m-%d %H:%M:%S.%f"))
cursor.close()

哪个输出:

datetime.datetime(2012, 11, 11, 16, 40, 26, 788966)
2012-11-11 16:40:26.788966

【讨论】:

  • 我做了同样的事情,但得到了错误: strptime() argument 1 must be string, not buffer 。我正在使用 Python 2.6
  • 我做了什么,我在另一个变量中分配了 row[0]: f = row[0][:]buffer 转换为 str然后 strptime 接受了这个值。
  • 我的示例使用 Python 2.7 进行了测试。可能是 Python 2.6 返回的是缓冲区而不是字符串。
  • 是的,似乎是版本问题。你能告诉我如何格式化 datetime.datetime(2012, 11, 11, 13, 9, 29, 141720) 吗? strftime() 不起作用,因为它作为元组返回
  • 我想我找到了原因。我作为 from datetime import datetime,date, time 导入,我认为上次导入导致覆盖 datetime 中的某些函数。通过删除额外的模块导入,它现在似乎可以工作了
【解决方案2】:

您的问题的根本原因是认为从 Sqlite 数据库中获取的 'buffer' 对象为 'string' 对象,字符串对象具有 encode() 方法,但 'buffer' 对象没有此方法。 您需要做的很简单:只需将 'buffer' 对象转换为字符串对象,这并不难,只需在代码中添加一行即可:

tempString=str(item[10])

_f = tempString.decode("utf-8")

我今天也遇到了同样的问题,google了下就到这里了,还没有找到合适的答案。所以在这里提供。 sqlite 记录数据的类型是缓冲区还是字符串,取决于我们如何构建数据库表,以及 sqlite 版本和 sqlite db 插件的版本,因此您的测试结果与 Pedro Romano 的不同。但无论如何,只要添加这一行:tempString=str(item[10]),它可以强制系统将其用作字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 2019-07-29
    • 2018-06-03
    相关资源
    最近更新 更多