Python 如何在强制转换操作中包装列

Python 如何在强制转换操作中包装列,python,sqlalchemy,Python,Sqlalchemy,我有一个MSSQL数据库,其中的表无法更改,只能以只读(SELECT语句)的形式与之交互。我在用炼金术。我需要做的是在CAST()SQL操作中为每个查询自动包装特定的列。我希望在较低的级别上执行此操作,这样我的代码就不需要考虑问题。我这样做的原因在中有解释 我的桌子是这样的: from sqlalchemy import Column, Integer, Sequence from sqlalchemy.ext.declarative import declarative_base Base

我有一个MSSQL数据库,其中的表无法更改,只能以只读(SELECT语句)的形式与之交互。我在用炼金术。我需要做的是在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)
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)
我一直在尝试使用这样的TypeDecorator:

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)
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)

但是它似乎没有任何作用。

我认为您需要确保您至少使用了SQLAlchemy的0.8版,其中添加了
column\u expression()
功能。您的代码的一个简单测试可用于此目的:

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

谢谢@zzzeek,我的成绩是0.7。我现在又回到正轨上了。这对我来说是一个长期存在的问题,我可能正在寻求更广泛的解决方案。谢谢你的炼金术,它让我的生活更轻松。