I want to have a primary key id with type uuid in a Postgresql database using SQLAlchemy 1.1.5, connecting to the database with the pg8000 adapter. I used the Backend-agnostic GUID Type recipe from the SQLAlchemy documentation.
When I want to insert into the database, I get the following error
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'
my model looks like this
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)
My resource or controller looks like this
data = req.params
item = Item(name=data['name'], description=data['description'])
self.session.add(item)
self.session.commit()
This should fix it:
from https://bitbucket.org/zzzeek/sqlalchemy/issues/3323/in-099-uuid-columns-are-broken-with:
This can be fairly frustrating when using UUIDs across a system. Under certain conditions, it might be difficult to control whether a UUID comes in as a string, or as a raw UUID. To work around this, a solution like this might work. I've attached the examples of the doc to make sure everything else still holds true.
Please use this your own discretion, this is just an example.
The
pg8000
PostgreSQL database adapter is returning auuid.UUID()
object (see their type mapping documentation, and SQLAlchemy has passed that to theTypeDecorator.process_result_value()
method.The implementation given in the documentation expected a string, however, so this fails:
The quick work-around is to force the value to be a string anyway:
or you can test for the type first:
I've submited pull request #403 to fix this in the documentation (since merged).
I had this issue affecting my ORM without using forms. I was running psycopg2. The fix for me was to:
After restarting apache, I haven't see the error again as of psycopg2-binary version 2.7.5+