SQLAlchemy中来自列注释的强制

SQLAlchemy中来自列注释的强制,sqlalchemy,Sqlalchemy,大家好, 我有一个字符串文件,对应于我的SQLAlchemy对象的字段。有些字段是浮点数,有些是整数,有些是字符串 我希望能够通过查询列定义将字符串强制转换为正确的类型。这可能吗 例如: class MyClass(Base): ... my_field = Column(Float) 感觉应该能够说出类似MyClass.my_field.column.type的内容,并要求类型直接强制字符串,或者根据需要编写一些条件和int(x)、float(x) 我想知道如果所有的值都是字

大家好,

我有一个字符串文件,对应于我的SQLAlchemy对象的字段。有些字段是浮点数,有些是整数,有些是字符串

我希望能够通过查询列定义将字符串强制转换为正确的类型。这可能吗

例如:

class MyClass(Base):
    ...
    my_field = Column(Float)
感觉应该能够说出类似MyClass.my_field.column.type的内容,并要求类型直接强制字符串,或者根据需要编写一些条件和int(x)、float(x)

我想知道如果所有的值都是字符串,这是否会自动发生,但我收到了Oracle错误,因为类型不正确

目前,我天真地强制——如果它是float()函数,那就是我的值,否则它是字符串,我相信整数float在插入时会变成整数,因为它们是精确表示的。但是运行时的值是错误的(例如1.0 vs 1),而且看起来很马虎

谢谢你的意见

SQLAlchemy 0.7.4

我不确定我是否正确地阅读了这个问题,但我会这样做:

class MyClass(Base):
    some_float = Column(Float)
    some_string = Column(String)
    some_int = Column(Int)
    ...

    def __init__(self, some_float, some_string, some_int, ...):
        if isinstance(some_float, float):
            self.some_float = somefloat
        else:
            try:
                self.some_float = float(somefloat)
            except:
                # do something intelligent
        if isinstance(some_string, string):
        ...
我会对每一列重复检查过程。我相信任何事情都能“自动”完成。我还希望您的字符串文件结构良好,否则必须执行更复杂的操作

假设您的文件是CSV(我不擅长python中的文件读取,所以请将其作为伪代码阅读):


我不确定我是否正确地阅读了这个问题,但我会这样做:

class MyClass(Base):
    some_float = Column(Float)
    some_string = Column(String)
    some_int = Column(Int)
    ...

    def __init__(self, some_float, some_string, some_int, ...):
        if isinstance(some_float, float):
            self.some_float = somefloat
        else:
            try:
                self.some_float = float(somefloat)
            except:
                # do something intelligent
        if isinstance(some_string, string):
        ...
我会对每一列重复检查过程。我相信任何事情都能“自动”完成。我还希望您的字符串文件结构良好,否则必须执行更复杂的操作

假设您的文件是CSV(我不擅长python中的文件读取,所以请将其作为伪代码阅读):


您可以迭代映射的
表的列

for col in MyClass.__table__.columns:
    print col, repr(col.type)
。。。因此,您可以通过名称检查每个字段的类型,如下所示:

def get_col_type(cls_, fld_):
    for col in cls_.__table__.columns:
        if col.name == fld_:
            return col.type # this contains the instance of SA type

assert Float == type(get_col_type(MyClass, 'my_field'))

如果您的文件很大,我会缓存结果,以便在从文件导入的每一行上保存循环的

您可以在映射的
表的列上迭代:

for col in MyClass.__table__.columns:
    print col, repr(col.type)
。。。因此,您可以通过名称检查每个字段的类型,如下所示:

def get_col_type(cls_, fld_):
    for col in cls_.__table__.columns:
        if col.name == fld_:
            return col.type # this contains the instance of SA type

assert Float == type(get_col_type(MyClass, 'my_field'))

不过,如果您的文件很大,我会缓存结果,以便在从文件导入的每一行上保存
for loop

在提交到某个数据库之前,为sqlalchemy键入强制


在提交到某个数据库之前,为sqlalchemy键入强制


嗨,乔纳森,谢谢你的留言。恐怕你的起首字母是我所说的天真的强迫;int不起作用,尽管我想另一种情况可能是如果float(x)=int(x)。这一切都取决于字符串(其中约50个)的类型是否正确,我可以检查是否可以检索列类型,而不是从值中进行推断。还有其他想法吗?你帮了我大忙。嗨,乔纳森,谢谢你的留言。恐怕你的起首字母是我所说的天真的强迫;int不起作用,尽管我想另一种情况可能是如果float(x)=int(x)。这一切都取决于字符串(其中约50个)的类型是否正确,我可以检查是否可以检索列类型,而不是从值中进行推断。还有其他想法吗?你帮了我大忙。