【问题标题】:Datetime format for piecash transactionpiecash 交易的日期时间格式
【发布时间】:2021-04-04 01:44:47
【问题描述】:

我正在编写一个非常简单的代码来使用 piecash 将交易写入 GNU Cash book。我的日期格式有问题。代码如下:

from collections import defaultdict
import piecash
import datetime

gnubook = 'E:\\piecash_test\\teste.gnucash'
book = piecash.open_book(gnubook, readonly=False, do_backup=False)

p_date = datetime.datetime(2020, 12, 26)
#p_date = datetime.date(2020, 12, 26)

broker = book.accounts(name="Broker account")
dest = book.accounts(name="AAPL")


inj_tr = piecash.Transaction(   currency=book.default_currency,
                                description='Transaction Description',
                                post_date=p_date,
                                splits=[
                                    piecash.Split(  account=dest,
                                                    value=1000,
                                                    quantity=100,
                                                    memo='Transaction destination memo'),
                                    piecash.Split(  account=broker,
                                                    value=-1000,
                                                    memo='Transaction broker memo'),
                                ])
book.save()

问题在于 p_date 变量。如果使用:

p_date = datetime.datetime(2020, 12, 26)

我从 piecash 收到以下错误:

Traceback (most recent call last):
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1204, in _execute_context
    context = constructor(dialect, self, conn, *args)
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\engine\default.py", line 855, in _init_compiled
    param.append(processors[key](compiled_params[key]))
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\sql\type_api.py", line 1227, in process
    return impl_processor(process_param(value, dialect))
  File "E:\piecash_test\piecash\venv\lib\site-packages\piecash\sa_extra.py", line 135, in process_bind_param
    assert isinstance(value, datetime.date) and not isinstance(value, datetime.datetime), \
AssertionError: value 2020-12-26 00:00:00 is not of type datetime.date but type <class 'datetime.datetime'>
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2540, in flush
    self._flush(objects)
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2682, in _flush
    transaction.rollback(_capture_exception=True)
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\util\langhelpers.py", line 68, in __exit__
    compat.raise_(
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\util\compat.py", line 182, in raise_
    raise exception
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2642, in _flush
    flush_context.execute()
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 422, in execute
    rec.execute(self)
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 586, in execute
    persistence.save_obj(
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\orm\persistence.py", line 239, in save_obj
    _emit_insert_statements(
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\orm\persistence.py", line 1135, in _emit_insert_statements
    result = cached_connections[connection].execute(
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1011, in execute
    return meth(self, multiparams, params)
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\sql\elements.py", line 298, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1124, in _execute_clauseelement
    ret = self._execute_context(
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1206, in _execute_context
    self._handle_dbapi_exception(
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1510, in _handle_dbapi_exception
    util.raise_(
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\util\compat.py", line 182, in raise_
    raise exception
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\engine\base.py", line 1204, in _execute_context
    context = constructor(dialect, self, conn, *args)
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\engine\default.py", line 855, in _init_compiled
    param.append(processors[key](compiled_params[key]))
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\sql\type_api.py", line 1227, in process
    return impl_processor(process_param(value, dialect))
  File "E:\piecash_test\piecash\venv\lib\site-packages\piecash\sa_extra.py", line 135, in process_bind_param
    assert isinstance(value, datetime.date) and not isinstance(value, datetime.datetime), \
sqlalchemy.exc.StatementError: (builtins.AssertionError) value 2020-12-26 00:00:00 is not of type datetime.date but type <class 'datetime.datetime'>
[SQL: INSERT INTO transactions (guid, currency_guid, num, post_date, enter_date, description) VALUES (?, ?, ?, ?, ?, ?)]
[parameters: [{'post_date': datetime.datetime(2020, 12, 26, 0, 0), 'enter_date': datetime.datetime(2020, 12, 26, 12, 37, 10), 'description': 'Transaction Description', 'num': '', 'currency_guid': None}]]

但是,使用p_date = datetime.date(2020, 12, 26) 格式,错误变为:

Traceback (most recent call last):
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\util\compat.py", line 182, in raise_
    raise exception
  File "E:\piecash_test\piecash\venv\lib\site-packages\sqlalchemy\orm\state.py", line 430, in _initialize_instance
    return manager.original_init(*mixed[1:], **kwargs)
  File "E:\piecash_test\piecash\venv\lib\site-packages\piecash\core\transaction.py", line 244, in __init__
    raise GncValidationError("post_date should be a date object")
piecash._common.GncValidationError: post_date should be a date object

我知道问题与变量是 datetimetype 还是 instance 的变量有关,但我无法解决。 有人可以帮帮我吗? 谢谢

【问题讨论】:

  • 你好,你能提供你正在使用的 piecash 和 gnucash 版本吗?使用日期作为 p_date 时我没有问题。
  • 嗨! gnucash 4.2+(2020-09-26),piecash 1.1.2,python 3.8。我在 pycharm 中运行代码。谢谢!
  • Post_date 应该是一个日期(不是日期时间)。但是,在两个堆栈跟踪中,我看到 post_date 的日期时间令人惊讶。在我的笔记本电脑上使用最新的 piecash 和日期,我没有错误。

标签: python datetime gnucash


【解决方案1】:

我不知道出了什么问题,但是在将 python 更新到 3.9 后它工作了。谢谢

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 2011-06-17
    • 2017-12-10
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多