SQLAlchemy MySQL 时间戳列值
SQLAlchemy MySQL Timestamp column value
我需要执行一个查询,该查询仅比较 TIMESTAMP 列中的年份和月份值,其中的记录如下所示:
2015-01-01 08:33:06
SQL 查询非常简单(有趣的部分是 year(timestamp) 和 month(timestamp)它提取了年份和月份,以便我可以将它们用于比较:
SELECT model, COUNT(model) AS count
FROM log.logs
WHERE SOURCE = "WEB"
AND year(timestamp) = 2015
AND month(timestamp) = 01
AND account = "TEST"
AND brand = "Nokia"
GROUP BY model
ORDER BY count DESC limit 10
现在的问题:
这是我的SQLAlchemy 查询:
devices = (db.session.query(Logs.model, Logs.timestamp,
func.count(Logs.model).label('count'))
.filter_by(source=str(source))
.filter_by(account=str(acc))
.filter_by(brand=str(brand))
.filter_by(year=year)
.filter_by(month=month)
.group_by(Logs.model)
.order_by(func.count(Logs.model).desc()).all())
部分:
.filter_by(year=year)
.filter_by(month=month)
与
不一样
AND year(timestamp) = 2015
AND month(timestamp) = 01
我的 SQLAchemy 查询不起作用。 year 和 month 似乎是 MySQL 从时间戳列中提取值的函数。
我的数据库模型如下所示:
class Logs(db.Model):
id = db.Column(db.Integer, primary_key=True)
timestamp = db.Column(db.TIMESTAMP, primary_key=False)
.... other attributes
有趣的是,当我 select 并打印 Logs.timestamp
时,它的格式如下:
(datetime.datetime(2013, 7, 11, 12, 47, 28))
如果我希望我的 SQLAlchemy 查询按数据库时间戳年份和月份进行比较,这部分应该如何在 SQLAlchemy 中编写?
.filter_by(year=year) #MySQL - year(timestamp)
.filter_by(month=month) #MySQL- month(timestamp)
我尝试了 .filter(Logs.timestamp == year(timestamp)
和类似的变体,但没有成功。任何帮助将不胜感激。
如果您想使用特定于您的数据库的函数,例如您为 MySQL
提到的 year
函数,您可以使用 custom constructs。但是我不使用 MySQL
并且不能给你一些经过测试的代码(顺便说一句,我什至不知道这个功能)。
对于 Oracle(已测试),这将是一个简单且无用的示例。我希望你能从中很容易地推断出你的。
from sqlalchemy.sql import expression
from sqlalchemy.ext.compiler import compiles
from sqlalchemy import Date
class get_current_date(expression.FunctionElement):
type = Date()
@compiles(get_current_date, 'oracle')
def ora_get_current_date(element, compiler, **kw):
return "CURRENT_DATE"
session = schema_mgr.get_session()
q = session.query(sch.Tweet).filter(sch.Tweet.created_at == get_current_date())
tweets_today = pd.read_sql(q.statement, session.bind)
不过我不需要提及,这种方式会使高度可移植的 SQLAlchemy
代码的可移植性降低一些。
希望对您有所帮助。
只需替换:
.filter_by(year=year)
.filter_by(month=month)
与:
from sqlalchemy.sql.expression import func
# ...
.filter(func.year(Logs.timestamp) == year)
.filter(func.month(Logs.timestamp) == month)
在文档的 SQL and Generic Functions 部分阅读更多相关信息。
我需要执行一个查询,该查询仅比较 TIMESTAMP 列中的年份和月份值,其中的记录如下所示:
2015-01-01 08:33:06
SQL 查询非常简单(有趣的部分是 year(timestamp) 和 month(timestamp)它提取了年份和月份,以便我可以将它们用于比较:
SELECT model, COUNT(model) AS count
FROM log.logs
WHERE SOURCE = "WEB"
AND year(timestamp) = 2015
AND month(timestamp) = 01
AND account = "TEST"
AND brand = "Nokia"
GROUP BY model
ORDER BY count DESC limit 10
现在的问题:
这是我的SQLAlchemy 查询:
devices = (db.session.query(Logs.model, Logs.timestamp,
func.count(Logs.model).label('count'))
.filter_by(source=str(source))
.filter_by(account=str(acc))
.filter_by(brand=str(brand))
.filter_by(year=year)
.filter_by(month=month)
.group_by(Logs.model)
.order_by(func.count(Logs.model).desc()).all())
部分:
.filter_by(year=year)
.filter_by(month=month)
与
不一样AND year(timestamp) = 2015
AND month(timestamp) = 01
我的 SQLAchemy 查询不起作用。 year 和 month 似乎是 MySQL 从时间戳列中提取值的函数。
我的数据库模型如下所示:
class Logs(db.Model):
id = db.Column(db.Integer, primary_key=True)
timestamp = db.Column(db.TIMESTAMP, primary_key=False)
.... other attributes
有趣的是,当我 select 并打印 Logs.timestamp
时,它的格式如下:
(datetime.datetime(2013, 7, 11, 12, 47, 28))
如果我希望我的 SQLAlchemy 查询按数据库时间戳年份和月份进行比较,这部分应该如何在 SQLAlchemy 中编写?
.filter_by(year=year) #MySQL - year(timestamp)
.filter_by(month=month) #MySQL- month(timestamp)
我尝试了 .filter(Logs.timestamp == year(timestamp)
和类似的变体,但没有成功。任何帮助将不胜感激。
如果您想使用特定于您的数据库的函数,例如您为 MySQL
提到的 year
函数,您可以使用 custom constructs。但是我不使用 MySQL
并且不能给你一些经过测试的代码(顺便说一句,我什至不知道这个功能)。
对于 Oracle(已测试),这将是一个简单且无用的示例。我希望你能从中很容易地推断出你的。
from sqlalchemy.sql import expression
from sqlalchemy.ext.compiler import compiles
from sqlalchemy import Date
class get_current_date(expression.FunctionElement):
type = Date()
@compiles(get_current_date, 'oracle')
def ora_get_current_date(element, compiler, **kw):
return "CURRENT_DATE"
session = schema_mgr.get_session()
q = session.query(sch.Tweet).filter(sch.Tweet.created_at == get_current_date())
tweets_today = pd.read_sql(q.statement, session.bind)
不过我不需要提及,这种方式会使高度可移植的 SQLAlchemy
代码的可移植性降低一些。
希望对您有所帮助。
只需替换:
.filter_by(year=year)
.filter_by(month=month)
与:
from sqlalchemy.sql.expression import func
# ...
.filter(func.year(Logs.timestamp) == year)
.filter(func.month(Logs.timestamp) == month)
在文档的 SQL and Generic Functions 部分阅读更多相关信息。