12

変更できないテーブルを含む MSSQL データベースがあり、読み取り専用 (SELECT ステートメント) としてしか操作できません。私はsqlalchemyを使用しています。私がする必要があるのは、すべてのクエリの CAST() SQL 操作で特定の列を自動的にラップすることです。コードが問題について考える必要がないように、これを低レベルで実行したいと考えています。私がこれを行っている理由は、この質問で説明されています。

私のテーブルは次のようなものです:

from sqlalchemy import Column, Integer, Sequence
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class myTable(Base):
    __tablename__ = u'mytable'
    id = Column(Integer, Sequence('table_id_seq'), primary_key=True)
    problem_field = Column(DECIMAL(12, 4), nullable=True)

私は次のように TypeDecorator を使用しようとしています:

from sqlalchemy import Column, Integer, Sequence, types
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql.expression import cast

Base = declarative_base()

class CastToFloatType(types.TypeDecorator):
    '''Converts stored Decimal values to Floats via CAST operation
    '''
    impl = types.Numeric
    def column_expression(self, col):
        return cast(col, Float)

class myTable(Base):
    __tablename__ = u'mytable'
    id = Column(Integer, Sequence('table_id_seq'), primary_key=True)
    wrapped_field = Column(CastToFloatType, nullable=True)

しかし、それは何もしないようです。

4

1 に答える 1

10

column_expression()機能が追加された SQLAlchemy の少なくともバージョン 0.8 を使用していることを確認する必要があると思います。コードの簡単なテストは、この目的で機能します。

from sqlalchemy import Column, Integer, Sequence, types, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql.expression import cast

Base = declarative_base()

class CastToFloatType(types.TypeDecorator):
    '''Converts stored Decimal values to Floats via CAST operation
    '''
    impl = types.Numeric
    def column_expression(self, col):
        return cast(col, Float)

class myTable(Base):
    __tablename__ = u'mytable'
    id = Column(Integer, Sequence('table_id_seq'), primary_key=True)
    wrapped_field = Column(CastToFloatType, nullable=True)

from sqlalchemy.orm import Session
s = Session()
print s.query(myTable)

出力:

SELECT mytable.id AS mytable_id, CAST(mytable.wrapped_field AS FLOAT) AS mytable_wrapped_field 
FROM mytable
于 2013-11-15T17:50:04.057 に答える