読者です 読者をやめる 読者になる 読者になる

DUAL or テーブルを指定しないクエリ

SQLAlchemy

 相変わらず、SQLAlchemyを愛でる日々が続いております。


 SQLAlchemyのドキュメントに「テーブルを指定しないクエリの場合は、select()のengineキーワード引数にEngineオブジェクトを与えよ」という記載があり、「OracleのDUAL表の場合はどうするんだろう?」と思い、試してみました。

>>> from sqlalchemy import *
>>> oracle = create_engine('oracle://scott:tiger@tns', echo=True, convert_unicode=True)
>>> select(["sysdate"], engine=oracle).execute().fetchone()
2007-03-06 21:09:24,479 INFO sqlalchemy.engine.base.Engine.0x..70 SELECT sysdate FROM DUAL
2007-03-06 21:09:24,494 INFO sqlalchemy.engine.base.Engine.0x..70 {}
(datetime.datetime(2007, 3, 6, 21, 9, 23),)


 おおっ、自動的にDUALから選択してくれました!もちろん、MySQLで、上の例と等価な操作を行った場合は、FROM句は追加されません。

>>> mysql = create_engine('mysql://user:password@localhost/dbname?charset=utf8', echo=True)
>>> select([func.now()], engine=mysql).execute().fetchone()
2007-03-06 21:14:04,806 INFO sqlalchemy.engine.base.Engine.0x..50 SELECT now()
2007-03-06 21:14:04,806 INFO sqlalchemy.engine.base.Engine.0x..50 []
(datetime.datetime(2007, 3, 6, 21, 14, 4),)


 何気ないことなのですが、こういう操作も期待通りに動作するのがSQLAlchemyのよいところですね。