Попытка использовать UUID для первичного ключа. Получение устаревших данных по SQLalchemy commit()

Начиная SQLalchemy пользователь здесь. Я планирую использовать UUID в качестве первичных ключей для моих таблиц.

В этом уроке я увидел некоторый код для использования собственного типа UUID Python в классах ORM. Эврика! Я могу использовать собственный тип UUID Postgresql для своей системной базы данных, и этот TypeDecorator будет записывать UUID для SQLite на моих мобильных клиентах.

http://docs.sqlalchemy.org/en/latest/core/types.html

Печаль. При использовании этого с существующей базой данных SQLite, в которой первичный ключ имеет строковые UUID, я получаю устаревшие ошибки данных, когда пытаюсь зафиксировать какие-либо изменения.

Этот класс падает с устаревшими данными при коммите.

class CommodityTypes(Base):
    __tablename__ = 'CommodityTypes'
    uuidKey = Column(GUID, primary_key=True)
    myName = Column(String, unique = True)
    sortKey = Column(Integer, unique = True)

, но этот класс работает:

class NewTypes(Base):
    __tablename__ = 'CommodityTypes'
    uuidKey = Column(String, primary_key=True)
    myName = Column(String, unique = True)
    sortKey = Column(Integer, unique = True)

Запрашиваемые объекты из класса CommodityTypes показывают тип UUID python для uuidKey. Скрипт запрашивает объект правильно. Я могу изменить настройки, но не могу зафиксировать. Декорированный uuidKey, похоже, не работает.

Я могу пойти дальше, просто используя Strings для столбцов uuidKey, но меня расстраивает то, что код из http://docs.sqlalchemy.org/en/latest/core/types.html почти работает.

Вот пример кода с проблемой. Обход строки, не использующий декоратор типа GUID, закомментирован.

#system modules
import uuid

#other modules
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref, sessionmaker
from sqlalchemy.types import TypeDecorator, CHAR
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound

engine = create_engine('sqlite:////home/XXXX/XobfuscatedXXXX/XXXXXXXX.sqlite')

Base = declarative_base()

Session = sessionmaker(bind=engine)

class GUID(TypeDecorator):
    """Platform-independent GUID type.

    Uses Postgresql's UUID type, otherwise uses
    CHAR(32), storing as stringified hex values.

    """
    impl = CHAR

    def load_dialect_impl(self, dialect):
        if dialect.name == 'postgresql':
            return dialect.type_descriptor(UUID())
        else:
            return dialect.type_descriptor(CHAR(32))

    def process_bind_param(self, value, dialect):
        if value is None:
            return value
        elif dialect.name == 'postgresql':
            return str(value)
        else:
            if not isinstance(value, uuid.UUID):
                return "%.32x" % uuid.UUID(value)
            else:
                # hexstring
                return "%.32x" % value

    def process_result_value(self, value, dialect):
        if value is None:
            return value
        else:
            return uuid.UUID(value)

from sqlalchemy import Column, Boolean, DateTime, Date, Float, ForeignKey, Integer, Numeric, String

class CommodityTypes(Base):
    __tablename__ = 'CommodityTypes'
    uuidKey = Column(GUID, primary_key=True)
    myName = Column(String, unique = True)
    sortKey = Column(Integer, unique = True)

#class NewTypes(Base):
#    __tablename__ = 'CommodityTypes'
#    uuidKey = Column(String, primary_key=True)
#    myName = Column(String, unique = True)
#    sortKey = Column(Integer, unique = True)

if __name__=="__main__":
    session = Session()
#    newList = session.query(NewTypes).order_by(NewTypes.sortKey)
#    for instance in newList:
#        print(instance.myName)
#
#    nt = newList[1]
#    print(nt.myName)
#    print(nt.sortKey)
#    nt.sortKey = 11
#    print(nt.sortKey)
#    session.commit()
#    print(nt.sortKey)

    ctList = session.query(CommodityTypes).order_by(CommodityTypes.sortKey)
    for instance in ctList:
        print(instance.myName)
    ct = ctList[1]
    print(ct.myName)
    print(ct.sortKey)
    ct.sortKey = 22
    print(ct.sortKey)
    session.commit()
    print(ct.sortKey)

О, забыл упомянуть версии программного обеспечения:

Python 3.1.3 (r313: 86834, 1 декабря 2010, 06:15:12)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] на linux2

0 ответов

Другие вопросы по тегам