2012-08-22 72 views
0

我有一個小桌子:自定義Django的二進制領域與SQL Server 2008的

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)' 

我需要將來自ORM實例的16字節二進制數據傳遞到數據庫。很可能我必須得到一個沒有引號的字符串,然後在SQL Server端接上0x ......但是怎麼做?

我使用的是unixodbc,pyodbc,django-odbc。

回答

0
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) 
+0

嗨,我在MySQL上面臨類似的問題,但我想要的只是在Django二進制領域模型,用於存儲通過MongoDB的產生12byte用戶ID。這種方法適合我的情況嗎?謝謝。 –

+0

爲什麼不呢?根據mysql和數據庫驅動程序修復get_db_prep_value和db_type函數的代碼。 –

+0

是的,它現在正在工作,我使用MySQLdb.escape_string而不是pyodbc.BINARY,那麼低級別的mysqldb lib可以理解十六進制字符串,並正確更新到二進制數據庫列中。 –