from sqlalchemy import Column, Integer, String, DateTime, Float
from sqlalchemy import create_engine, text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from datetime import datetime as dttm
import pandas as pd
import sys
Base = declarative_base()
class CTestTable(Base):
__tablename__ = 'testTable'
id = Column(Integer, primary_key=True, index=True)
datetime = Column(DateTime(timezone=False))
val = Column(Float)
info = Column(String(100))
def __repr__(self):
return "<User(name='%s', fullname='%s', password='%s')>" % (
def main():
# create engine
engine = create_engine('sqlite:///test.sqlitedb', echo=False)
# create session
Session = sessionmaker()
Session.configure(bind=engine)
session = Session()
# create tables in database
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
# add test data
testTables = []
testTables.append(CTestTable(datetime=dttm(2018, 1, 1), val=1.1, info='t1'))
testTables.append(CTestTable(datetime=dttm(2018, 1, 3), val=1.4, info='t1'))
testTables.append(CTestTable(datetime=dttm(2018, 1, 4), val=1.5, info='t1'))
testTables.append(CTestTable(datetime=dttm(2018, 1, 1), val=11.1, info='t2'))
testTables.append(CTestTable(datetime=dttm(2018, 1, 2), val=11.4, info='t2'))
testTables.append(CTestTable(datetime=dttm(2018, 1, 4), val=11.5, info='t2'))
session.add_all(testTables)
session.commit()
# print the table
qs = (session.query(CTestTable))
df = pd.read_sql(qs.statement, qs.session.bind)
print(df)
# applying SQL text:
ttext = (f"""select id,
datetime,
val,
info,
julianday("datetime") - julianday("PreviousDate") as datediff
from ( select id,
datetime,
val,
info,
(select max(datetime)
from testTable T2
where T2.info=T1.info
and T2.datetime < T1.datetime
) as PreviousDate
from testTable T1
) as T""")
stmt = text(ttext)
df = pd.read_sql(stmt, session.bind)
print(df)
if __name__ == '__main__':
sys.exit(main())