6

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

4

3 回答 3

10

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

import uuid

id = uuid.uuid4()

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

于 2009-10-05T23:09:03.717 回答
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)))

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

于 2009-10-09T13:44:40.773 回答
2

或者使用 ORM 映射:

import uuid
from sqlalchemy import Column, Integer, String, Boolean

def uuid_gen():
    return str(uuid.uuid4())

Base = declarative_base()
class Device(Base):
    id = Column(String, primary_key=True, default=uuid_gen)

这会将其存储为提供更好的数据库兼容性的字符串。但是,您将失去数据库更优化地存储和使用 uuid 的能力。

于 2012-05-30T22:27:46.247 回答