如何解析子句,作为筛选器中的参数方法?如何解析sqlalchemy中的filter子句
运行的
filters_clause = Record.start> = '2017年7月17日'
打印(filters_clause)
给出了一个串
记录.start> =:start_1
这是必要的实际值而不是:start_1和该值必须已通过process_bind_param函数。我必须使用哪种方法来获得这样的字符串:records.start> ='1500321600.0'?
#!/usr/bin/env python
# coding=utf-8
from __future__ import (division, absolute_import,
print_function, unicode_literals)
import time
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker, attributes
from sqlalchemy.types import TypeDecorator
from sqlalchemy import create_engine, MetaData, Column, Integer, String
Base = declarative_base()
class EpochTime(TypeDecorator):
impl = Integer
def process_bind_param(self, value, dialect):
if isinstance(value, unicode):
if value.isdigit():
return value
if len(value) == 10:
value = time.mktime(time.strptime(value, "%Y-%m-%d"))
elif len(value) == 13:
value = time.mktime(time.strptime(value, "%Y-%m-%d %H"))
elif len(value) == 16:
value = time.mktime(time.strptime(value, "%Y-%m-%d %H:%M"))
return value
def process_result_value(self, value, dialect):
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(value))
class Record(Base):
__tablename__ = 'records'
id = Column(Integer, primary_key=True)
name = Column(String)
start = Column(EpochTime)
engine = create_engine('sqlite://')
session = scoped_session(sessionmaker())
session.configure(bind=engine)
Base.metadata.create_all(engine)
record = Record(name = 'Record 1', start = '2017-07-16')
session.add(record)
record = Record(name = 'Record 2', start = '2017-07-17')
session.add(record)
record = Record(name = 'Record 3', start = '2017-07-18')
session.add(record)
session.commit()
filters_clause = Record.start>='2017-07-17'
s = session.query(Record).filter(filters_clause)
res = s.all()
names = [i.name for i in Record.__table__.c]
rows = [[row.__dict__.get(i) for i in names] for row in res]
for row in rows:
print(row)
print(0, s)
print(1, filters_clause)
你在标题(“解析”)中比在正文中提出了另一个问题(“编译为'records.start> ='1500321600.0''”)。你能澄清你的问题吗? – univerio
英语不是我的母语,请原谅我的错误。我认为'编译'方法是我所期待的。但是使用这种方法并没有给我预期的结果。但是,也许我做错了什么。无论如何,我认为你的评论是准确的,只是需要编辑条款值。 – Stan