使用Pylons和SQLalchemy在sqlite中存储UUIDs

7
我正在使用SQLalchemy和sqlite开发我的第一个Pylons项目。 我想在其中一个表中使用UUID作为主键。我找到了下面的问题,并使用代码向SQLalchemy添加了自定义UUID()类型(第二种解决方案,我无法弄清楚如何使用zzzeek的建议)。

Random ids in sqlalchemy (pylons)

然而,当我尝试它时,我得到了ValueError('bytes is not a 16-char string')的错误信息。我怀疑这与我试图将此UUID存储在sqlite VARCHAR类型字段中有关。 有人知道我应该在sqlite中使用什么类型的字段才能适用于来自SQLalchemy的这些UUID吗?
谢谢, Erik
2个回答

9

你是对的,这只适用于我使用的postgresql数据库。 但是我深入研究了你提供的帖子Random ids in sqlalchemy (pylons),它确实在sqlite中起作用,只是不要按照zzzeek的回答操作, 转而采用Tom Willis的解决方案,只需考虑一些事情,我完全遵循了这个代码,但做了一些改变: 逐行:

#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)

And that works for me, good luck!

previous answer

user = Table(
    'User',
    meta.metadata,
    Column('ID', UUID(as_uuid=True), primary_key=True),
    Column('Name', String(250), nullable=False, unique=True)
)

嗨@rob.alarcon, 感谢您的建议。我有几乎相同的代码,只是没有'as_uuid=True'这部分。 当我添加它时,它不起作用(TypeError:__init __()收到了意外的关键字参数'as_uuid')。 我认为问题不在SQLalchemy中,而更多地在于我需要定义什么类型的字段才能将这些UUID存储到SQLite中……class Person(Base): __tablename__ = "person" id = Column(UUID(), primary_key=True) firstname = Column(Unicode(30)) lastname = Column(Unicode(50)) - Erik Oosterwaal

2

sqlite 模块期望处理 unicode 数据(在存储到数据库之前会将其编码为 UTF-8)用于文本字段。您可以通过将值包含在 buffer() 调用中来发送二进制数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接