sqlalchemy(塔)中的随机ID

Ced*_*ric 6 mysql uuid pylons sqlalchemy

我正在使用pylons和sqlalchemy,我想知道如何将一些randoms id作为primary_key.

zzz*_*eek 9

最好的方法是使用随机生成的UUID:

import uuid

id = uuid.uuid4()
Run Code Online (Sandbox Code Playgroud)

uuid数据类型在一些数据库中本身可用,例如Postgresql(SQLAlchemy为此目的具有本机PG uuid数据类型 - 在0.5中调用它sqlalchemy.databases.postgres.PGUuid).您还应该能够在任何16字节的CHAR字段中存储一个uuid(尽管我没有在MySQL或其他方面专门尝试过这个).


Tom*_*lis 5

我使用这种模式,并且效果很好。资源

from sqlalchemy import types
from sqlalchemy.databases.mysql import MSBinary
from sqlalchemy.schema import Column
import uuid


class UUID(types.TypeDecorator):
    impl = MSBinary
    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 not isinstance(value,uuid.UUID):
            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


id_column_name = "id"

def id_column():
    import uuid
    return Column(id_column_name,UUID(),primary_key=True,default=uuid.uuid4)

#usage
my_table = Table('test',metadata,id_column(),Column('parent_id',UUID(),ForeignKey(table_parent.c.id)))
Run Code Online (Sandbox Code Playgroud)

尽管我相信zzzeek是sqlalchemy的作者,所以如果这是错误的话,他会知道的,我会听他的。