使用this post的建议,并且在设置asdecimal属性之前不使用反射表,我可以使用浮点数而不是Decimals.
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))
输出:
DOUBLE(asdecimal=False)
注意:如果在设置asdecimal = False之前对反射表进行查询,则column.type仍显示为DOUBLE(asdecimal = False),但值的类型仍为Decimal.我猜这是因为SQLAlchemy正在执行某种缓存,但是我现在暂时不能确定这一点.