![](/img/trans.png)
[英]sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'Movie'
[英]sqlalchemy.exc.ProgrammingError: (ProgrammingError) can't adapt type 'UUID'
我的桌子是
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())
)
當我嘗試插入數據時,我明白了
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')},
然后我把我的桌子改成了
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())
)
然后我開始看到錯誤
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'})
現在為什么uuid.uuid4()
總會給出相同的值? 我該如何解決這個問題?
謝謝
要使您的第一個代碼示例UUID(as_uuid=True)
,您需要設置UUID(as_uuid=True)
(請參閱UUID
上的文檔),否則DBAPI適配器需要一個字符串值。
您的第二個示例不起作用,因為default=str(uuid.uuid4())
存儲一個字符串值,該值在定義表對象時生成一次,並且每次都使用(因此重復值異常)。 您需要在此處傳遞函數,因此每次插入行時都會對其進行求值:
default=lambda: str(uuid.uuid4())
同樣代表default=datetime.utcnow()
,它必須是default=datetime.utcnow
。 另一件事是主鍵不需要unique=True
約束,因為它已經保證是唯一的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.