The*_*cle 9 python postgresql uuid sqlalchemy pg8000
我希望使用SQLAlchemy在postgresql数据库中使用类型为uuid的主键id.我在这里使用了GUID脚本.
当我想插入数据库时,我收到以下错误
File ".../guid.py", line ???, in process_result_value
return uuid.UUID(value)
File "/usr/lib/python2.7/uuid.py", line 131, in __init__
hex = hex.replace('urn:', '').replace('uuid:', '')
AttributeError: 'UUID' object has no attribute 'replace'
Run Code Online (Sandbox Code Playgroud)
我的模型看起来像这样
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from guid import GUID
import uuid
base = declarative_base()
class Item(base):
__tablename__ = 'item'
id = Column(GUID(), default=uuid.uuid4, nullable=False, unique=True, primary_key=True)
name = Column(String)
description = Column(String)
def __repr__(self):
return "<Item(name='%s', description='%s')>" % (self.name, self.description)
Run Code Online (Sandbox Code Playgroud)
我的资源或控制器看起来像这样
data = req.params
item = Item(name=data['name'], description=data['description'])
self.session.add(item)
self.session.commit()
Run Code Online (Sandbox Code Playgroud)
我在debian 8上使用sqlalchemy 1.1.5和postgresql以及pg8000适配器.我该如何解决这个问题?
jrc*_*jrc 10
这应该解决它:
id = Column(GUID(as_uuid=True), ...)
Run Code Online (Sandbox Code Playgroud)
来自https://bitbucket.org/zzzeek/sqlalchemy/issues/3323/in-099-uuid-columns-are-broken-with:
“如果要传递
UUID()对象,则as_uuid必须将标志设置为True。”
的pg8000PostgreSQL数据库适配器返回一个uuid.UUID()对象(参见其类型映射文档,和SQLAlchemy的已通过该给TypeDecorator.process_result_value()方法.
但是,文档中给出的实现需要一个字符串,因此失败:
>>> import uuid
>>> value = uuid.uuid4()
>>> uuid.UUID(value)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mjpieters/Development/Library/buildout.python/parts/opt/lib/python2.7/uuid.py", line 133, in __init__
hex = hex.replace('urn:', '').replace('uuid:', '')
AttributeError: 'UUID' object has no attribute 'replace'
Run Code Online (Sandbox Code Playgroud)
快速解决方法是将值强制为字符串:
def process_result_value(self, value, dialect):
if value is None:
return value
else:
return uuid.UUID(str(value))
Run Code Online (Sandbox Code Playgroud)
或者您可以先测试类型:
def process_result_value(self, value, dialect):
if value is None:
return value
else:
if not isinstance(value, uuid.UUID):
value = uuid.UUID(value)
return value
Run Code Online (Sandbox Code Playgroud)
我提交了拉取请求#403以在文档中修复此问题(自合并以来).