【问题标题】:Python mariadb connector returns datetime.datetimePython mariadb 连接器返回 datetime.datetime
【发布时间】:2023-02-19 21:55:49
【问题描述】:

我正在编写一个脚本来查询 mariadb 数据库,它返回这样的查询输出 ('101', datetime.datetime(2023, 1, 27, 14, 8, 39), datetime.datetime(2023, 1, 27, 14, 8, 39) 相反,我想要这样的输出 ('101', '2023-01-27 14:08:39.399', 0, '2023-01-27 14:08:39.399')

try:
    conn = mariadb.connect()
except mariadb.Error as e:
    print(f"Error connecting to MariaDB Platform: {e}")
    sys.exit(1)

# Get Cursor
cur = conn.cursor()

cur.execute("SELECT * FROM <table>")
myresult = cur.fetchall()
print(myresult)
cur.close()

我在尝试使用 pyodbc 时遇到了类似的问题,所以我使用了我的自定义输出转换器,但我没有找到这个库的任何问题 这是我在 pyodbc 中的做法

`  
    # function to convert datetime.date(2022, 10, 12) with data type date to string
    def convert_date_to_string(raw_bytes):
        tup = struct.unpack('3h', raw_bytes)
        return datetime.date(tup[0], tup[1], tup[2]).strftime('%Y-%m-%d')
    conn.add_output_converter(po.SQL_TYPE_DATE, convert_date_to_string)

请为 mariadb 连接器建议一种类似的方法,因为我不想为我所做的每个查询添加解析器,而是我想像上面提到的那样在 pyodbc 中做一些全局的事情。

【问题讨论】:

  • 如果它只是关于显示而不更改数据类型:游标对象通常(可以)使用 row_factory。查找基类以及如何设置它(可能在连接上完成)并使用自定义类和处理数据时间对象的自定义 __str__ 函数扩展该类。类似地为返回的结果编写您自己的(命名的)类元组包装类以用于打印目的。
  • @Daraan 我也想更改类型,因为我正在编写的代码是为了处理 str 数据类型而编写的,因为它是为 sqlite 编写的,我正在将它移植到 mariadb,还有一个问题是我应该改用 mysql 连接器吗?

标签: python mariadb mysql-python


【解决方案1】:

数据库驱动程序的默认行为是将数据库值转换为相应的 Python 数据类型。

如果您需要将其转换为另一个值,您可以使用 CAST 函数在 SQL 级别执行此操作

>>> cursor.execute("select cast(now() as char)")
>>> cursor.fetchone()
('2023-02-19 14:42:51',)

或者使用转换器:

>>> import mariadb
>>> from mariadb.constants import FIELD_TYPE
>>> 
>>> def date_to_str(date):
...   return str(date)
... 
>>> conversions= {
...     **{FIELD_TYPE.DATETIME: date_to_str}
... }
>>> 
>>> conn= mariadb.connect(converter=conversions)
>>> cursor=conn.cursor()
>>> cursor.execute("SELECT NOW()")
>>> cursor.fetchone()
('2023-02-19 14:50:29',)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-28
    • 2021-05-30
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2020-02-29
    • 1970-01-01
    相关资源
    最近更新 更多