Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python peewee+;MySQL,如何创建封装SQL内置的自定义字段类型?_Python_Mysql_Python 2.7_Peewee - Fatal编程技术网

Python peewee+;MySQL,如何创建封装SQL内置的自定义字段类型?

Python peewee+;MySQL,如何创建封装SQL内置的自定义字段类型?,python,mysql,python-2.7,peewee,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(F

我想在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
通过使用,您可以调用内部命令,如下所示:

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