2012-08-22 5 views
0

나는 작은 테이블이 : 나는 SQL 쿼리와 레코드를 삽입 할 수 있습니다사용자 정의 장고 진 필드 및 SQL 서버 2008

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

:

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

이 테이블에 대한 장고 모델은 다음과 같습니다

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 진수 2 진 데이터를 데이터베이스에 전달해야합니다. 대부분의 경우 SQL 서버 측에 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을 유사한 문제에 직면,하지만 내가 원하는 MongoDB에 의해 생성 된 12byte 사용자 ID를 저장하는 데 사용되는 장고 단지 바이너리 필드 모델로하고있다. 이 방법이 내 경우에 적합한가요? 감사. –

+0

왜 안 되니? mysql 및 데이터베이스 드라이버에 따라 get_db_prep_value 및 db_type 함수의 코드를 수정하십시오. –

+0

현재 작동 중입니다. pyodbc.BINARY 대신 MySQLdb.escape_string을 사용하면 저수준 mysqldb lib가 16 진수 문자열을 인식하고 db의 이진 열로 올바르게 업데이트 할 수 있습니다. –