7

我将 Mysqldb 与 Python(2.7) 一起使用以从具有字符集 latin1 的 Mysql 数据库中返回一堆值。

mysql 数据库在返回时具有 bit(1) 类型的值,它们看起来像这样 '\x01'

十进制值像这样返回 Decimal('0E-8')

他们其余的值和类型都很好。

示例数据库结果集:

{'test': '\x01', 'currency': u'bla', 'balance': Decimal('0E-8'), 'first': u'John'}

这就是我连接数据库的方式: self.con = MySQLdb.connect(host = conn['host'], user = conn['user'], passwd=conn['passwd'], db=conn['db '], charset=conn['charset'],port = int(conn['port']) if 'port' in conn else 3306)

我希望将 bit(1) 值返回为 True 或 False。我环顾四周,我认为可能是做 MySQLdb.converters.conversions 但我不知道如何实现这一点。任何想法都会很棒。谢谢

而且我无权更改数据库中的类型。

4

4 回答 4

10

尝试:

orig_conv = MySQLdb.converters.conversions
#Adding support for bit data type
orig_conv[FIELD_TYPE.BIT] = lambda data: data == '\x01'

passing this into my connection.
MySQLdb.connect(conv=orig_conv)

使用“orig_conv[FIELD_TYPE.BIT] = bool”对我来说一切都是真的

于 2017-04-07T04:16:22.580 回答
5

与 MySQL 内部的开发人员交谈时,他们都说 BIT 数据类型被破坏并且充满了错误。

示例:为什么不应该在 MySQL 中使用 BIT 列作者 Baron Schwartz, High Performance MySQL的合著者。

所以我建议使用 TINYINT 并存储 0 或 1 来表示布尔值。您不会浪费任何空间,因为 BIT 列的大小无论如何都会四舍五入到最接近的整个字节。

MySQL 甚至有一个数据类型别名BOOL。当你使用它时,它被映射到TINYINT(1)(尽管 1 不影响任何东西)。


如果您无法更改数据类型,则可以将其映射到 SQL 查询中的整数:

MySQL 使用 1 或 0 作为布尔值,所以你可以这样做:

SELECT (test=B'1') AS test, currency, balance, first FROM ...

或者你可以更详细:

SELECT IF(test=B'1', 1, 0) AS test, currency, balance, first FROM ...

或者你可以完全兼容 SQL:

SELECT CASE test=B'1' WHEN true THEN 1 ELSE 0 END AS test, currency, balance, first FROM ...
于 2013-10-08T19:09:41.023 回答
1

想通了:所以不得不在 Mysqldb 包中挖掘一点。

orig_conv = MySQLdb.converters.conversions
#Adding support for bit data type
orig_conv[FIELD_TYPE.BIT] = bool

passing this into my connection.
MySQLdb.connect(conv=orig_conv)

FIELD_TYPE可以在中找到并且MySQLdb.constants可以通过这种方式导入

from MySQLdb.constants import FIELD_TYPE
于 2013-10-09T09:37:33.973 回答
0
from pymysql import converters
converions = converters.conversions
converions[pymysql.FIELD_TYPE.BIT] = lambda x: '0' if x == '\x00' else '1'
db = pymysql.connect(mysql_host, mysql_user, mysql_password, mysql_db, 3306,charset='utf8',conv=converions)
于 2020-11-09T03:18:33.963 回答