(新的SQLAlchemy用户警报)我有三个表:一个人,从特定日期开始的人每小时费率和每日时间报告.我正在寻找正确的方法,以便在当天的人员每小时费率中扣除时间费用.
是的,我可以在创建时计算该值,并将其作为模型的一部分,但请将此视为总结幕后更复杂数据的示例.我如何计算Time.cost?它是hybrid_propery,column_property还是完全不同的东西?
class Person(Base):
__tablename__ = 'person'
personID = Column(Integer, primary_key=True)
name = Column(String(30), unique=True)
class Payrate(Base):
__tablename__ = 'payrate'
payrateID = Column(Integer, primary_key=True)
personID = Column(Integer, ForeignKey('person.personID'))
hourly = Column(Integer)
starting = Column(Date)
__tableargs__ =(UniqueConstraint('personID', 'starting',
name='uc_peron_starting'))
class Time(Base):
__tablename__ = 'entry'
entryID = Column(Integer, primary_key=True)
personID = Column(Integer, ForeignKey('person.personID'))
workedon = Column(Date)
hours = Column(Integer)
person = relationship("Person")
def __repr__(self):
return "<{date} {hours}hrs ${0.cost:.02f}>".format(self,
date=self.workedon.isoformat(), hours=to_hours(self.hours))
@property
def cost(self):
'''Cost of entry
'''
## This is where I …Run Code Online (Sandbox Code Playgroud) 使用sqlite3作为数据库,我想保留几个decimal.Decimal值,一个百分比另一个美元金额.但是我在超过20,000个条目上使用sum(金额)时遇到了问题.这是几美元.
我想过使用适配器来节省分数,然后聚合应该有效.
sqlite3.register_adapter(decimal.Decimal, lambda x:str(x))
sqlite3.register_adapter(decimal.Decimal, lambda x:int(x*100))
Run Code Online (Sandbox Code Playgroud)
但是,我现在需要两个类,因为我不能使用同一个类.试图将Decimal子类化成一个问题因为它本身使用了Decimal.精细.我将复制decimal.py并用Money | money替换每个Decimal | decimal的出现.
$ copy decimal.py money.py $ sed -e "s/Decimal/Money/g" -e "s/decimal/money/g" -i money.py $ money.py
所有单元测试都有效.我现在尝试,我得到一个"可能不受支持的类型"错误.我改变转换器,使用基本类型.我只是无法让它正常工作,我对这个问题没有更好的想法.
我需要一些帮助,下面有一个示例.关于如何使用标准库使其工作或更好的解决方案的想法?
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 …Run Code Online (Sandbox Code Playgroud)