2017-07-25 112 views
0

我有一個自定義ID來的SQLAlchemy模型UUID格式的SQLAlchemy通過自定義列

class Email(Base): 
    __tablename__ = 'Email' 

    id = Column(UUID(), primary_key=True, default=uuid.uuid4) 
    raw_email = Column(Text) 

,當我試圖通過ID得到一些對象

session.query(Email).get("0c7a2a97-c93b-4f26-9408-25d2bf597bc0") 

它返回一個錯誤選擇

can't escape UUID to binary 

我知道自定義ID中的問題,因爲ID是UUID類型,但是可以創建一些預處理器或其他s同樣的事情,使我有機會使用str選擇對象。由於轉換海峽到UUID每當我需要選擇一些對象將是很討厭

我創建自己的功能,這將

def str_to_uuid(value): 
    uuid = UUID() 
    return uuid.process_bind_param(value) 

時間,這將是如此有益的,如果我可以裝點ID使用此功能。或者這樣做的風格不好?

+0

是那個[PostgreSQL的具體UUID類型(http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#sqlalchemy.dialects.postgresql.UUID)或其他什麼東西? –

+0

@IljaEverilä是的,我在PostgreSQL中使用的這種類型的列 –

+0

您的答案會給人一種印象,那就是您使用的是自定義類型,而不是'sqlalchemy.dialects.postgresql.UUID'。 –

回答

0

我明白爲什麼我有這個問題。

class UUID(types.TypeDecorator): 
    impl = types.LargeBinary 

    def __init__(self): 
     self.impl.length = 16 
     types.TypeDecorator.__init__(self, length=self.impl.length) 

    def process_bind_param(self, value, dialect=None): 
     if value and isinstance(value, uuid.UUID): 
      return value.bytes 
     elif value and isinstance(value, str): 
      return uuid.UUID(value) 
     elif value: 
      raise ValueError('value %s is not a valid uuid.UUID' % value) 
     else: 
      return None 

    def process_result_value(self, value, dialect=None): 
     if value: 
      return uuid.UUID(bytes=value) 
     else: 
      return None 

    def is_mutable(self): 
     return False 

這是我實現的UUID列類型。而我的錯誤是在 process_bind_param。我忘了補充bytes

elif value and isinstance(value, str): 
      return uuid.UUID(value) 

當我改變方法

def process_bind_param(self, value, dialect=None): 
     ... 
     elif value and isinstance(value, str): 
      return uuid.UUID(value).bytes 
     elif value: 
      raise ValueError('value %s is not a valid uuid.UUID' % value) 
     else: 
      return None 

也許這將是有益的人所以我解決這個問題。

0

我一直在flask-sqlalchemy中使用它,似乎沒有問題。

from sqlalchemy.dialects.postgresql import UUID 
from sqlalchemy import desc, func 

class User(db.Model): 
    __tablename__ = 'users' 
    id = db.Column(UUID, primary_key=True, 
     server_default=func.uuid_generate_v4()) 
+0

你可以說你用什麼版本的sqlalchemy和flask-sqlalchemy? –

+0

Flask-SQLAlchemy == 2.1 sqlalchemy == 1.1 – ionheart

+0

嗯很有趣......在我的項目Flask-SQLAlchemy == 2.2和sqlalchemy == 1.1.11中,但是我得到了一個UUID沒有找到的異常。 –