2024-05-10 10:40:25 发布
网友
如果使用PostgreSQL(Postgres),是否可以在SQLAlchemy中将列(主键)定义为UUID?
sqlalchemy postgres方言支持UUID列。这很简单(问题是特别的后记)——我不明白为什么其他答案都这么复杂。
下面是一个例子:
from sqlalchemy.dialects.postgresql import UUID from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Foo(db.Model): id = db.Column(db.Integer, primary_key=True) uuid = db.Column(UUID(as_uuid=True), unique=True, nullable=False)
I wrote this域名不见了,但这是勇气。。。。
不管那些真正关心正确数据库设计的同事们对用于关键字段的UUID和guid有何看法。我经常发现我需要这样做。我认为它比自动增值有一些优势,值得一试。
在过去的几个月里,我一直在改进UUID列的类型,我想我终于实现了。
from sqlalchemy import types from sqlalchemy.dialects.mysql.base 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)))
我相信作为二进制(16字节)存储应该比字符串表示(36字节?)更有效率,而且似乎有一些迹象表明,在mysql中索引16字节块应该比字符串更有效。反正我也不指望会更糟。
我发现的一个缺点是,至少在phpymyadmin中,您不能编辑记录,因为它隐式地尝试对id=…”的“select*from表”进行某种字符转换,并且存在其他显示问题。
除此之外,一切似乎都很好,所以我把它扔在那里。如果你看到一个明显的错误,请留下评论。我欢迎任何改进建议。
除非我遗漏了一些东西,否则如果基础数据库具有UUID类型,上面的解决方案将起作用。如果没有,则在创建表时可能会出现错误。我提出的解决方案最初是以MSSqlServer为目标,后来改为MySql,所以我认为我的解决方案更灵活一些,因为它在MySql和sqlite上似乎工作得很好。还没来得及查邮件呢。
另请参见SQLAlchemy文档中有关列类型的Backend-agnostic GUID Type配方。
sqlalchemy postgres方言支持UUID列。这很简单(问题是特别的后记)——我不明白为什么其他答案都这么复杂。
下面是一个例子:
I wrote this域名不见了,但这是勇气。。。。
不管那些真正关心正确数据库设计的同事们对用于关键字段的UUID和guid有何看法。我经常发现我需要这样做。我认为它比自动增值有一些优势,值得一试。
在过去的几个月里,我一直在改进UUID列的类型,我想我终于实现了。
我相信作为二进制(16字节)存储应该比字符串表示(36字节?)更有效率,而且似乎有一些迹象表明,在mysql中索引16字节块应该比字符串更有效。反正我也不指望会更糟。
我发现的一个缺点是,至少在phpymyadmin中,您不能编辑记录,因为它隐式地尝试对id=…”的“select*from表”进行某种字符转换,并且存在其他显示问题。
除此之外,一切似乎都很好,所以我把它扔在那里。如果你看到一个明显的错误,请留下评论。我欢迎任何改进建议。
除非我遗漏了一些东西,否则如果基础数据库具有UUID类型,上面的解决方案将起作用。如果没有,则在创建表时可能会出现错误。我提出的解决方案最初是以MSSqlServer为目标,后来改为MySql,所以我认为我的解决方案更灵活一些,因为它在MySql和sqlite上似乎工作得很好。还没来得及查邮件呢。
另请参见SQLAlchemy文档中有关列类型的Backend-agnostic GUID Type配方。
相关问题 更多 >
编程相关推荐