Python 如何在强制转换操作中包装列
我有一个MSSQL数据库,其中的表无法更改,只能以只读(SELECT语句)的形式与之交互。我在用炼金术。我需要做的是在CAST()SQL操作中为每个查询自动包装特定的列。我希望在较低的级别上执行此操作,这样我的代码就不需要考虑问题。我这样做的原因在中有解释 我的桌子是这样的:Python 如何在强制转换操作中包装列,python,sqlalchemy,Python,Sqlalchemy,我有一个MSSQL数据库,其中的表无法更改,只能以只读(SELECT语句)的形式与之交互。我在用炼金术。我需要做的是在CAST()SQL操作中为每个查询自动包装特定的列。我希望在较低的级别上执行此操作,这样我的代码就不需要考虑问题。我这样做的原因在中有解释 我的桌子是这样的: from sqlalchemy import Column, Integer, Sequence from sqlalchemy.ext.declarative import declarative_base Base
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。我现在又回到正轨上了。这对我来说是一个长期存在的问题,我可能正在寻求更广泛的解决方案。谢谢你的炼金术,它让我的生活更轻松。