我可以在Python测试中模拟sqlite3 CURRENT_TIMESTAMP吗?

rvpgvaaj  于 2023-01-11  发布在  Python
关注(0)|答案(1)|浏览(163)

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没有发生变化。

3xiyfsfu

3xiyfsfu1#

不要问我为什么,但是当你按照这个顺序做的时候(不管你是否评论我评论过的行),它似乎起作用了:

import sqlite3

# def mock_date(*_):
#     return '1975-01-01'

# def mock_time(*_):
#     return '00:00:00'

def mock_datetime(*_):
    return '1975-01-01 00:00:00'

with sqlite3.connect(':memory:') as con:
    
    # con.create_function('CURRENT_TIME', -1, mock_time)
    # print(con.execute('SELECT CURRENT_TIME').fetchone())
    
    # con.create_function('CURRENT_DATE', -1, mock_date)
    # print(con.execute('SELECT CURRENT_DATE').fetchone())
    
    con.create_function('CURRENT_TIMESTAMP', -1, mock_datetime)
    print(con.execute('SELECT CURRENT_TIMESTAMP').fetchone())

我得到这个结果:

('1975-01-01 00:00:00',)

老实说,我看不出我做了什么而你没有。(注意,使用你的代码,我得到了和你完全相同的结果。一定是一些模仿函数的顺序?)

  • Python 3.9.2和sqlite3.__version__ = 3.34.0*

相关问题