我有一个在Python代码之外定义的MySQL数据库。我正在使用反射将其导入SQLAlchemy,因此我没有可以修改的任何类定义。我不必担心会失去精度,并且我会对Python中的结果进行一些算术运算,因此我宁愿不必手动将一堆值转换为float或Decimal。

import sqlalchemy as sa

eng = sa.create_engine("mysql+pymysql://user:passwd@server/database")
eng.execute("create table if not exists foo (x double not null)")
eng.execute("insert into foo (x) values (0.1)")

md = sa.MetaData(bind=eng)
md.reflect()
foo = md.tables["foo"]

res = eng.execute(foo.select())
row = res.fetchone()
print(type(row.x))
print(repr(foo.c.x.type))

输出:
<class 'decimal.Decimal'>
DOUBLE

最佳答案

使用this post的建议,并且不使用反射表,直到我设置asdecimal属性,我才能获得浮点数而不是十进制数。

import sqlalchemy as sa

eng = sa.create_engine("mysql+pymysql://chiptest:fryisthedevil@database/bench_drylake")
eng.execute("create table if not exists foo (x double not null)")
eng.execute("insert into foo (x) values (0.1)")

md = sa.MetaData(bind=eng)
md.reflect()
foo = md.tables["foo"]

# this needs to happen before any queries
for table in md.tables.values():
    for column in table.columns.values():
        if isinstance(column.type, sa.Numeric):
            column.type.asdecimal = False

res = eng.execute(foo.select())
row = res.fetchone()
print(type(row.x))
print(repr(foo.c.x.type))

输出:
<class 'float'>
DOUBLE(asdecimal=False)

注意:如果在设置asdecimal = False之前对反射表进行查询,则column.type仍显示为DOUBLE(asdecimal=False),但值的类型仍为Decimal。我猜这是因为SQLAlchemy正在进行某种缓存,但是我现在暂时不能确定这一点。

关于python - 反射(reflect)表时如何使sqlalchemy返回float而不是Decimal?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19387882/

10-13 09:18