Sqlalchemy.exc.ProgrammingError: (ProgrammingError) cannot adapt type 'UUID'

My table

   categories = table('categories',
                       Column('uuid', UUID(), default=uuid.uuid4,
                              primary_key=True,
                              unique=True, autoincrement=False),
                       Column('name', String),
                       Column('parent', String),
                       Column('created_on', sa.types.DateTime(timezone=True),
                              default=datetime.utcnow())
    )

when i try to insert data i see

sqlalchemy.exc.ProgrammingError: (ProgrammingError) can't adapt type 'UUID' 'INSERT INTO categories (uuid, name, parent, created_on) VALUES (%(uuid)s, %(name)s, %(parent)s, %(created_on)s)' ({'created_on': datetime.datetime(2013, 3, 31, 4, 12, 26, 801940), 'name': 'Alcohol & Bars', 'parent': 'Food & Drink', 'uuid': UUID('860e5bae-b770-425f-8672-c15c49508a1f')}, {'created_on': datetime.datetime(2013, 3, 31, 4, 12, 26, 801940), 'name': 'Coffee & Tea', 'parent': 'Food & Drink', 'uuid': UUID('de6ad60e-a076-483d-90e9-93916c537583')},

then I change the table to

categories = table('categories',
                   Column('uuid', UUID(), default=str(uuid.uuid4()),
                          primary_key=True,
                          unique=True, autoincrement=False),
                   Column('name', String),
                   Column('parent', String),
                   Column('created_on', sa.types.DateTime(timezone=True),
                          default=datetime.utcnow())
)

then I start to see the error as

sqlalchemy.exc.IntegrityError: (IntegrityError) duplicate key value violates unique constraint "categories_pkey"

    DETAIL:  Key (uuid)=(cb80a166-adce-4a6e-9e1a-c210d9b86732) already exists.
     'INSERT INTO categories (uuid, name, parent, created_on) VALUES (%(uuid)s, %(name)s, %(parent)s, %(created_on)s)' ({'created_on': datetime.datetime(2013, 3, 31, 4, 14, 22, 732107), 'name': 'Alcohol & Bars', 'parent': 'Food & Drink', 'uuid': 'cb80a166-adce-4a6e-9e1a-c210d9b86732'}, {'created_on': datetime.datetime(2013, 3, 31, 4, 14, 22, 732107), 'name': 'Coffee & Tea', 'parent': 'Food & Drink', 'uuid': 'cb80a166-adce-4a6e-9e1a-c210d9b86732'}, {'created_on': datetime.datetime(2013, 3, 31, 4, 14, 22, 732107), 'name': 'Dessert', 'parent': 'Food & Drink', 'uuid': 'cb80a166-adce-4a6e-9e1a-c210d9b86732'}, {'created_on': datetime.datetime(2013, 3, 31, 4, 14, 22, 732107), 'name': 'Fast Food', 'parent': 'Food & Drink', 'uuid': 'cb80a166-adce-4a6e-9e1a-c210d9b86732'}, {'created_on': datetime.datetime(2013, 3, 31, 4, 14, 22, 732107), 'name': 'Groceries', 'parent': 'Food & Drink', 'uuid': 'cb80a166-adce-4a6e-9e1a-c210d9b86732'}, {'created_on': datetime.datetime(2013, 3, 31, 4, 14, 22, 732107), 'name': 'Other', 'parent': 'Food & Drink', 'uuid': 'cb80a166-adce-4a6e-9e1a-c210d9b86732'}, {'created_on': datetime.datetime(2013, 3, 31, 4, 14, 22, 732107), 'name': 'Restaurants', 'parent': 'Food & Drink', 'uuid': 'cb80a166-adce-4a6e-9e1a-c210d9b86732'}, {'created_on': datetime.datetime(2013, 3, 31, 4, 14, 22, 732107), 'name': 'Snacks', 'parent': 'Food & Drink', 'uuid': 'cb80a166-adce-4a6e-9e1a-c210d9b86732'}  ... displaying 10 of 43 total bound parameter sets ...  {'created_on': datetime.datetime(2013, 3, 31, 4, 14, 22, 732107), 'name': 'Other', 'parent': 'Financial', 'uuid': 'cb80a166-adce-4a6e-9e1a-c210d9b86732'}, {'created_on': datetime.datetime(2013, 3, 31, 4, 14, 22, 732107), 'name': 'Tax Preparation', 'parent': 'Financial', 'uuid': 'cb80a166-adce-4a6e-9e1a-c210d9b86732'})

Now, how is it that uuid.uuid4()gives the same value always? How can I fix this problem?

thank

+5
source share
1 answer

For your first code sample to work, you need to install UUID(as_uuid=True)(see the docs for UUID), otherwise the DBAPI adapter expects a string value.

, default=str(uuid.uuid4()) , , ( ). , , ​​:

default=lambda: str(uuid.uuid4())

default=datetime.utcnow(), default=datetime.utcnow. , unique=True , .

+6

All Articles