python - peewee + MySQL,如何创建包装 SQL 内置插件的自定义字段类型?

标签 python mysql python-2.7 peewee

我想在 peewee(通过 MySQL)中创建一个自定义 UUID 字段。

在 python 中,我将 UUID 用作十六进制字符串,例如:

uuid = '110e8400-e29b-11d4-a716-446655440000'

但我想将它存储在数据库中的 BINARY(16) 类型的列中以节省空间。

MySQL 有内置的 HEX()UNHEX() 方法来在字符串和二进制之间来回转换。

所以我的问题是如何告诉 peewee 生成使用内置函数的 SQL?这是我想要使用的代码的想法:

class UUIDField(Field):
    db_field='binary(16)'

    def db_value(self, value):
        if value is not None:
            uuid = value.translate(None, '-')   # remove dashes
            # HERE: How do I let peewee know I want to generate
            # a SQL string of the form "UNHEX(uuid)"?

    def python_value(self, value):
        if value is not None:
            # HERE: How do I let peewee know I want to generate
            # a SQL string of the form "HEX(value)"?

请注意,我特别询问如何让 peewee 在自定义 SQL 中包装或解包一个值。我意识到我可能可以完全在 python 中进行值转换,但我正在寻找更通用的基于 SQL 的解决方案。

编辑:为了将来引用,这里是我如何让它在 python 中进行转换。虽然它没有回答问题,所以任何想法都会受到赞赏!

import binascii
from peewee import *

db = MySQLDatabase(
    'database',
    fields={'binary(16)': 'BINARY(16)'}     # map the field type
)

# this does the uuid conversion in python
class UUIDField(Field):
    db_field='binary(16)'

    def db_value(self, value):
        if value is None: return None

        value = value.translate(None, '-')
        value = binascii.unhexlify(value)

        return value

    def python_value(self, value):
        if value is None: return None

        value = '{}-{}-{}-{}-{}'.format(
            binascii.hexlify(value[0:4]),
            binascii.hexlify(value[4:6]),
            binascii.hexlify(value[6:8]),
            binascii.hexlify(value[8:10]),
            binascii.hexlify(value[10:16])
        )

        return value

最佳答案

使用 SelectQuery你可以调用内部 SQL functions像这样:

from peewee import SelectQuery

# this does the uuid conversion in python
class UUIDField(Field):
    db_field = 'binary(16)'

    def db_value(self, value):
        if value is None: return None

        value = value.translate(None, '-')
        query = SelectQuery(self.model_class, fn.UNHEX(value).alias('unhex'))
        result = query.first()
        value = result.unhex
        return value

    def python_value(self, value):
        if value is None: return None
        query = SelectQuery(self.model_class, fn.HEX(value).alias('hex'))
        result = query.first()
        value = '{}-{}-{}-{}-{}'.format(
            result.hex[0:8],
            result.hex[8:12],
            result.hex[12:16],
            result.hex[16:20],
            result.hex[20:32]
        )
        return value

关于python - peewee + MySQL,如何创建包装 SQL 内置插件的自定义字段类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32385337/

相关文章:

python - 获取属性错误 : 'Tensor' object has no attribute 'log_prob' while saving a tensorflow model

php - 为 MySQL 表或许多 MySQL 数据库添加前缀?

python - 使用 Python 读取 MS-Word 文件中页眉和页脚中的表格内容

Python 追加未按预期工作

python - python中不加控制符打印的方法

python - 像 'var and do_something_with(var)' 这样的语句在 Python 中有什么影响?

python - 在Python中获取波兰语字符

python - 清理 SQLite 输入

MySQL:从字符串列中获取分配数字

php - mysql查询上的EXISTS查询优化