gpt4 book ai didi

python - 在带适配器的 sqlite3 中使用小数和货币时出现问题

转载 作者:IT王子 更新时间:2023-10-29 06:29:35 25 4
gpt4 key购买 nike

使用 sqlite3 作为数据库,我想保留几个 decimal.Decimal 值,一个是百分比,另一个是美元金额。但是,在超过 20,000 个条目上使用 sum(amount) 时,我发现了问题。优惠了好几美元。

我想过使用适配器来保存美分数量,然后聚合应该可以工作。

sqlite3.register_adapter(decimal.Decimal, lambda x:str(x))
sqlite3.register_adapter(decimal.Decimal, lambda x:int(x*100))

但是,我现在需要两个类,因为我不能使用同一个类。尝试将 Decimal 子类化成为一个问题,因为它在自身内部使用 Decimal。美好的。我将复制 decimal.py 并将每次出现的 Decimal|decimal 替换为 Money|money。

$ copy decimal.py money.py$ sed -e "s/Decimal/Money/g" -e "s/decimal/money/g" -i money.py$ money.py

All the unit tests work. I try it now and I am getting a "probably unsupported type" error. I change around the converters, use basic types. I just can not get it working right and I don't have a better idea for the problem.

I need some help and have a sample below. Ideas on how to get it working or a better solution using standard libraries?

import decimal
import money
import sqlite3

sqlite3.register_adapter(decimal.Decimal, lambda x:str(x))
sqlite3.register_converter('decimal', decimal.Decimal)
sqlite3.register_adapter(money.Money, lambda x: int(value*100))
sqlite3.register_converter('intcents', lambda x: money.Money(x)/100)

conn = sqlite3.connect(":memory:",
detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
cursor = conn.cursor()
cursor.executescript("CREATE TABLE example(rate decimal, amount intcents)")

for x in (1,1,1,2,2,2,3,3,3):
rate = decimal.Decimal(str(x))/100
amount = money.Money(str(rate))

try:
cursor.execute("INSERT INTO example VALUES(?,?)", (rate, amount))
except:
print (rate, amount)
raise

cursor.execute("""SELECT sum(rate), sum(amount) FROM example""")
print cursor.fetchone()
cursor.execute("""SELECT sum(rate) as "t [decimal]", sum(amount)as "a [intcents]"FROM example""")
print cursor.fetchone()

最佳答案

有两种简单的解决方案,希望有人能有更直接的:
1. 转成字符串存入数据库
2. 乘以 100 并存储为货币值的整数
这两个都需要转换回十进制。当从数据库读取值时为十进制。

关于python - 在带适配器的 sqlite3 中使用小数和货币时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6047192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com