雲雀は高く空を舞い このページをアンテナに追加 RSSフィード

「ひよこは高く空を舞い」について

2009-11-28

[]PythonからSQLite3への日付型変数の登録 PythonからSQLite3への日付型変数の登録 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - PythonからSQLite3への日付型変数の登録 - 雲雀は高く空を舞い PythonからSQLite3への日付型変数の登録 - 雲雀は高く空を舞い のブックマークコメント

PythonからSQLiteにデータを登録するに当たり,datetime.date型とdatetime.datetime型をISO日付形式,ISO タイムスタンプ形式に変換する適合関数がデフォルトで登録されている.それ以外の形式に,あるいはそれ以外の型を適切な型に変換して登録したいときには適当な適合関数を書いて登録すればよい。

import sqlite3
import datetime, time
sqlite3.connect(":memory:")
cur = con.cursor()

cur.execute("select ?", (datetime.datetime.now(),))
print(cur.fetchone()[0])
2009-11-28 11:56:02.498758



sqlite3の日付処理関数については以前にまとめたけど再び。

日付処理関数はstrftime, datetime, date, time, Juliandayがあって、このうち datetime, date, time, Juliandayはそれぞれstrftimeの特別な場合。


書式はstrftime(format, timestring, [modifier, ...])datetime(timestring, [modifier, ...])など。


modifierにutcを指定した場合は,与えられたtimestringをローカルタイムゾーンでの日時として解釈しUTCの日時に変換して表示する.ローカルタイムゾーンがJSTの場合はtimestringから9時間引かれた時間が返る.


逆にlocaltimeを指定した場合は与えられたtimestringをUTCでの日時として解釈しローカルタイムゾーンの日時に変換して表示する。ローカルタイムゾーンがJSTの場合はtimestringに9時間たされた時間が返る.




cur.execute("select date(?)", (datetime.datetime.now(),))
print(cur.fetchone()[0])

2009-11-28
cur.execute("select time(?)", (datetime.datetime.now(),))
print(cur.fetchone()[0])

11:59:48
cur.execute("select datetime(?)", (datetime.datetime.now(),))
print(cur.fetchone()[0])

2009-11-28 11:59:48
cur.execute("select datetime(?, 'utc')", (datetime.datetime.now(),))
print(cur.fetchone()[0])

2009-11-28 02:59:29
cur.execute("select datetime(?, 'localtime')", (datetime.datetime.now(),))
print(cur.fetchone()[0])

2009-11-28 20:59:11

RizalRizal2014/07/09 08:56I'm impressed by your writing. Are you a professional or just very knoewedgeabll?

LevonLevon2014/07/22 08:01A piece of <a href="http://stosri.com">erioutidn</a> unlike any other!

DianaDiana2014/07/28 07:15Holy Tolode, so glad I clicked on this site first! http://lczmzwdrs.com [url=http://tstikgdimx.com]tstikgdimx[/url] [link=http://qosuuplpkx.com]qosuuplpkx[/link]

トラックバック - http://chick.g.hatena.ne.jp/allegro/20091128

2009-11-06

[]SQLiteにおける日付データの検索 SQLiteにおける日付データの検索 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - SQLiteにおける日付データの検索 - 雲雀は高く空を舞い SQLiteにおける日付データの検索 - 雲雀は高く空を舞い のブックマークコメント

SQLiteの日付処理関数の出力は文字列になるのでLike句などを用いて日付の検索を行う.

like句を用いた検索

select カラム, ... from テーブル where カラム like パターン;

パターンは文字列と演算子%, _を使用できる

%
任意の0文字以上の文字列
_
任意の1文字

テーブルtest中のtimestamp型変数var1に時間データが保存されているとして

114日のデータを検索
select var1 from table where date(var) == '2009-11-04'
23時のデータを検索
select var1 from table where time(var) like '23:%'
2009年の毎月4日のデータ
select var1 from table where date(var) like '2009-__-04'

日曜日のデータ
select var1 from table where strftime('%w', var) == 0

[]SQLite3の日付処理関数 SQLite3の日付処理関数 - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - SQLite3の日付処理関数 - 雲雀は高く空を舞い SQLite3の日付処理関数 - 雲雀は高く空を舞い のブックマークコメント

日付処理関数

SQLiteの日付処理関数としてstrftime, datetime, date, time, Juliandayがある。

日付処理関数は後述の書式の文字列/数値を、日付を表す文字列(Time Strings)として取り扱う.

日付処理関数のうちstrftime(format, timestring, [modifier, ...])はtimestringをformatを書式とした文字列を返す。残りの4関数はstrftimeの特別な場合となる.

Time Strings

  • YYYY-MM-DD
  • YYYY-MM-DD HH:MM
  • YYYY-MM-DD HH:MM:SS
  • YYYY-MM-DD HH:MM:SS.SSS
  • YYYY-MM-DDTHH:MM
  • YYYY-MM-DDTHH:MM:SS
  • YYYY-MM-DDTHH:MM:SS.SSS
  • HH:MM
  • HH:MM:SS
  • HH:MM:SS.SSS
  • now
  • DDDDDDDDDD (Jurius Time Stamp or Unix Time Stamp)

ユリウス歴日は紀元前4713年1月1日正午(UTC)からの日数、Unixタイムスタンプは1970-01-01 00:00 UTCを起点とする秒

strftimeのformat

%Y
%m
%d
月はじめからの日付
%H
時間(24時制)
%M
%S
%f
SS.SSS
%J
ユリウス歴日
%s
1970-01-01 00:00 UTCを起点とする秒 (UNIXタイムスタンプ)
%j
年始からの日付
%W
年始から何週目か
%w
曜日 (日曜日を0とした日付)
%%
%そのもの

日付処理関数のmodifier

  • NNN days
  • NNN hours
  • NNN minutes
  • NNN.NNNN seconds
  • NNN months
  • NNN years
  • start of month
  • start of year
  • start of day
  • weekday N
  • unixepoch
  • localtime
  • utc

unixepochが指定された場合、与えられたDDDDDDDDDD形式のtimestringをUnixタイムスタンプとして扱う。指定されなかった場合はユリウス歴日として扱う。

localtimeが指定された場合、与えられたtimestringをUTCでの日時として解釈しローカルタイムゾーンの日時に変換して表示する。

utcが指定された場合、与えられたtimestringをローカルタイムゾーンでの日時として解釈しUTCの日時に変換して表示する。

トラックバック - http://chick.g.hatena.ne.jp/allegro/20091106

2009-11-02

[]ちょっとめも ちょっとめも - 雲雀は高く空を舞い を含むブックマーク はてなブックマーク - ちょっとめも - 雲雀は高く空を舞い ちょっとめも - 雲雀は高く空を舞い のブックマークコメント

追記

10k(個)*30(days)*12(monthes)*2(years)のデータをdbに登録するに当たり、インサート1回ずつcommitをしていたら、5400sec(=90min)/1daydataかかっていてこれはきつい、と思っていたんだけど、1dayごとにcommitするように変えたら5sec/1daydataになった…。なんということだ…。





sqliteの書き込みが遅いな、ということでメモ。

1) commitしないで書き込めば早い (その分データベースの破壊が恐い)

2) (これは僕のプログラミングスキルの問題)データを登録する前にそのデータがdbに存在するかを select で確認するよりもunique制約をつけた方が早い

3) executemany使うとどうなのかな。

executemanyはイテレータに使える。 12.6. sqlite3 ? DB-API 2.0 interface for SQLite databases — Python 3.6.2rc1 documentation

import sqlite3

class IterChars:
    def __init__(self):
        self.count = ord('a')

    def __iter__(self):
        return self

    def next(self):
        if self.count > ord('z'):
            raise StopIteration
        self.count += 1
        return (chr(self.count - 1),) # this is a 1-tuple

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table characters(c)")

theIter = IterChars()
cur.executemany("insert into characters(c) values (?)", theIter)

cur.execute("select c from characters")
print cur.fetchall()

4) O/R mapper使え?

ここら辺はよくわからない。ググってたら2007年の記事でSQLObjectとSQLAlchemyだったらSQLAlchemyの方がよっぽど早い、とか言う記事があったりした。O/R mapperはsqlを抽象化してオブジェクトから統一的に扱えるとかそう言う感じなのかしら。チューニングとか何とかいろいろな部分はmapper層にお任せしちゃうとかなのかなー(よくわかってない)

トラックバック - http://chick.g.hatena.ne.jp/allegro/20091102
テクノラティプロフィール