【问题标题】:Custom Django binary field & SQL Server 2008自定义 Django 二进制字段和 SQL Server 2008
【发布时间】:2012-08-22 06:41:43
【问题描述】:

我有一张小桌子:

CREATE TABLE [organization_division] (
[id] int IDENTITY (1, 1) NOT NULL PRIMARY KEY,
[uuid] binary(16) NOT NULL
)

我可以用 SQL 查询插入一条记录:

INSERT INTO [organization_division] ([uuid]) VALUES (0x244c71c6c9444f38b67ab1dcfbb5fc32)

这个表的 Django 模型是:

from apps.lib.fields import GUIDField

class Division(models.Model):
    uuid = GUIDField() 

GUIDField 是我创建自定义字段的尝试:

class GUIDField(models.Field):    
    description = "GUID binary field"
    __metaclass__ = models.SubfieldBase

    def __init__(self, *args, **kwargs):
        kwargs['max_length'] = 16
        super(GUIDField, self).__init__(*args, **kwargs)

    def db_type(self, connection):
        return 'binary(16)'

我需要将 16 字节的二进制数据从 ORM 实例传递到数据库。很可能我必须在 SQL Server 端获得一个不带引号的字符串,后跟 0x ......但是如何?

我正在使用 unixodbc、pyodbc、django-odbc。

【问题讨论】:

    标签: django sql-server-2008 pyodbc django-pyodbc


    【解决方案1】:
    from django.db import models
    import pyodbc
    
    class GUIDField(models.Field):    
        description = "GUID binary field"
        __metaclass__ = models.SubfieldBase
    
        def __init__(self, *args, **kwargs):
            kwargs['max_length'] = 16
            super(GUIDField, self).__init__(*args, **kwargs)
    
        def db_type(self, connection):
            return 'binary(16)'
    
        def get_db_prep_value(self, value):
            if value is None:
                return None
            return pyodbc.BINARY(value)
    

    【讨论】:

    • 嗨,我在 Mysql 上遇到了类似的问题,但我想要的只是 django 中的二进制字段模型,用于存储 MongoDB 生成的 12 字节用户 ID。这种方法适合我的情况吗?谢谢。
    • 为什么不呢?根据 mysql 和您的数据库驱动程序修复 get_db_prep_value 和 db_type 函数的代码。
    • 是的,它现在可以工作了,我使用 MySQLdb.escape_string 而不是 pyodbc.BINARY 然后低级 mysqldb 库可以理解十六进制字符串并正确更新到数据库中的二进制列。
    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    相关资源
    最近更新 更多