2016-08-31 25 views
0

,所以我试图调用MySQL的函数TIMEDATEDIFF第二常量作为第一个参数,像这样使用MySQL的SQLAlchemy的语法常量

query = session.query(func.TIME(Log.IncidentDetection).label('detection'), func.TIMESTAMPDIFF(SECOND,Log.IncidentDetection, Log.IncidentClear).label("duration")).all() 
    print(query) 

我已经尝试过作为一个字符串,我得到一个MySQL/MariaDB的错误:

query = session.query(func.TIME(Log.IncidentDetection).label('detection'), func.TIMESTAMPDIFF("SECOND",Log.IncidentDetection, Log.IncidentClear).label("duration")).all() 
print(query) 

给了我这个

sqlalchemy.exc.ProgrammingError: (mysql.connector.errors.ProgrammingError) 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''SECOND', log.`IncidentDetection`, log.`IncidentClear`) AS duration 
FROM log' at line 1 [SQL: 'SELECT TIME(log.`IncidentDetection`) AS detection, TIMESTAMPDIFF(%(TIMESTAMPDIFF_1)s, log.`IncidentDetection`, log.`IncidentClear`) AS duration \nFROM log'] [parameters: {'TIMESTAMPDIFF_1': 'SECOND'}] 

我相信这是简单的东西,某种转义序列或导入,我失踪。我查阅了sqlalchemy文档无济于事。

+0

这听起来像你想在一个字符串传递到位的查询一个单位。 – univerio

+0

第一个和第二个例子都会引发一个错误,第一个引发错误,因为SECOND没有在python中定义,第二个例子因为“SECOND”不是TIMESTAMPDIFF函数的有效参数而失败 – kyle

回答

1

为了让SQLAlchemy的准确分析串入我用_literal_as_text()功能

工作液


from sqlalchemy.sql.expression import func, _literal_as_text 
# ... 
query = session.query(func.TIME(Log.IncidentDetection).label('detection'), func.TIMESTAMPDIFF(_literal_as_text("SECOND"),Log.IncidentDetection, Log.IncidentClear).label("duration")).all() 
print(query)