Хранение UUID в sqlite с использованием Pylons и SQLalchemy - PullRequest
3 голосов
/ 01 мая 2011

Я работаю над своим первым проектом Pylons, используя SQLalchemy и sqlite. Я хотел бы использовать UUID в качестве первичного ключа для одной из моих таблиц. Я нашел вопрос ниже, и я использовал код, чтобы добавить пользовательский тип UUID () в SQLalchemy. (Второе решение, я не смог понять, как использовать предложение от zzzeek.)

Случайные идентификаторы в sqlalchemy (пилоны)

Однако, когда я пытаюсь это сделать, я получаю ValueError ('bytes не 16-символьная строка') Я подозреваю, что это связано с тем, что я пытаюсь сохранить этот UUID в поле типа sqlite VARCHAR. Кто-нибудь знает, какой тип поля я должен использовать в sqlite, который будет работать для этих UUID из SQLalchemy?

Спасибо, Erik

Ответы [ 2 ]

6 голосов
/ 01 мая 2011

Вы были правы, это просто работа для postgresql (я использую db).но я погружаюсь в пост, который вы предоставляете Случайные идентификаторы в sqlalchemy (pylons) , он действительно работает в sqlite, просто не следуйте ответу zzzeek, ​​перейдите к решениям Тома Уиллиса, просто некоторые вещи, которые следует учитыватьЯ завершаю этот код, но меняю некоторые вещи: строка за строкой:

#I delete follow line:
from sqlalchemy.databases.mysql import MSBinary

, потому что в sqlalchemy 0.6 это dialects.sqllite, но я не использую его, я использую:

from sqlalchemy.types import Binary

просто измените следующую строку в классе UUID:

class UUID(types.TypeDecorator):
    impl = Binary # this one!

...
...
id_column_name = "id"

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


#usage:
app_uuid = Column(u'app_uuid', UUID(), primary_key=True)

И это работает для меня, удачи!

предыдущий ответ

user = Table(
    'User',
    meta.metadata,
    Column('ID', UUID(as_uuid=True), primary_key=True),
    Column('Name', String(250), nullable=False, unique=True)
)
1 голос
/ 02 мая 2011

Модуль sqlite предполагает работу с данными unicode (которые он кодирует как UTF-8 перед сохранением в базе данных) для текстовых полей. Вы можете отправлять двоичные данные, заключив значение в вызов buffer().

...