bounty将在6天后过期。回答此问题可获得+50声望奖励。dimnnv希望引起更多人对此问题的关注:请提供一种在python测试中模拟sqlite3 CURRENT_TIMESTAMP的方法(如果有的话)。重写SQL代码以删除CURRENT_TIMESTAMP不是一个选项。
我想在Python测试中通过模拟返回值(不干扰系统时钟)来返回SQLite3 CURRENT_TIMESTAMP的自定义值。
我发现了this answer,但是它对CURRENT_TIMESTAMP不起作用(显然是因为它是一个关键字,而不是一个函数)。
**UPD.**尝试根据@forpas的建议模拟DATETIME()函数,但看起来它对CURRENT_TIMESTAMP不起作用(与直接调用DATETIME()不同):
def mock_date(*_):
return '1975-02-14'
def mock_datetime(*_):
return '1975-02-14 12:34:56'
connection = sqlite3.connect(':memory:')
print('Before DATE() mock, DATE(\'now\'): ' + connection.execute('SELECT DATE(\'now\')').fetchone()[0])
connection.create_function('DATE', -1, mock_date)
print('After DATE() mock, DATE(\'now\'): ' + connection.execute('SELECT DATE(\'now\')').fetchone()[0])
print('Before DATETIME() mock, CURRENT_TIMESTAMP: ' + connection.execute('SELECT CURRENT_TIMESTAMP').fetchone()[0])
print('Before DATETIME() mock, DATETIME(\'now\'): ' + connection.execute('SELECT DATETIME(\'now\')').fetchone()[0])
connection.create_function('DATETIME', -1, mock_datetime)
print('After DATETIME() mock, CURRENT_TIMESTAMP: ' + connection.execute('SELECT CURRENT_TIMESTAMP').fetchone()[0])
print('After DATETIME() mock, DATETIME(\'now\'): ' + connection.execute('SELECT DATETIME(\'now\')').fetchone()[0])
以下是测试结果:
Before DATE() mock, DATE('now'): 2023-01-08
After DATE() mock, DATE('now'): 1975-02-14
Before DATETIME() mock, CURRENT_TIMESTAMP: 2023-01-08 20:37:37
Before DATETIME() mock, DATETIME('now'): 2023-01-08 20:37:37
After DATETIME() mock, CURRENT_TIMESTAMP: 2023-01-08 20:37:37
After DATETIME() mock, DATETIME('now'): 1975-02-14 12:34:56
因此,在模拟DATETIME()
之后,DATETIME('now')
结果发生了变化,但CURRENT_TIMESTAMP
没有发生变化。
1条答案
按热度按时间3xiyfsfu1#
不要问我为什么,但是当你按照这个顺序做的时候(不管你是否评论我评论过的行),它似乎起作用了:
我得到这个结果:
老实说,我看不出我做了什么而你没有。(注意,使用你的代码,我得到了和你完全相同的结果。一定是一些模仿函数的顺序?)
sqlite3.__version__ = 3.34.0
*