2011-08-15 2 views
1

SQL Alchemy v0.6.4でdatetime列とリテラルdatetimeのMIN()を取得するにはどうすればよいですか?日時の結果を特定の範囲にクランプしたいORM属性とリテラル日時のMIN()を選択する方法は?

私はsqlalchemy.func.min(column, literal_datetime)を使用しています。これはSQLiteでは正常に動作するようですが、MySQLではまったく動作していないようですが、間違いなくこれは間違いです。 MySQLのからのエラーは次のとおりです。

sqlalchemy.exc.ProgrammingError: (ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' '2011-06-14 12:30:00') AS min_1 \nFROM example' at line 1") 'SELECT min(example.my_datetime, %s) AS min_1 \nFROM example' (datetime.datetime(2011, 6, 14, 12, 30),) 
  • 私は移植性のある形でのdatetime結果をクランプすることができますどのように?
  • (私は本当に私のアプリケーションでそれを行う必要がありますか?)

ここで私が問題を調査するために使用してきたものだ - ここに提示した(メモリベースのSQLiteのDBを使用して)正常に動作し、doesnのMySQLで」トンの仕事:

#!/usr/bin/env python 

import random 
from datetime import datetime 

import sqlalchemy as sa 
import sqlalchemy.orm as orm 
from sqlalchemy.ext.declarative import declarative_base 

orm_base = declarative_base() 

class MyClass(orm_base): 
    __tablename__ = "example" 
    pri_key = sa.Column(sa.Integer(), primary_key=True) 
    my_datetime = sa.Column(sa.DateTime(), index=True) 

engine = sa.create_engine("sqlite:///:memory:", echo=True) 

Session = orm.sessionmaker(bind=engine) 

orm_base.metadata.bind = engine 
orm_base.metadata.create_all() 

# Create test-data 

session = Session() 

random.seed(1234567980) 
for i in range(100): 
    month = random.randint(1, 12) 
    day = random.randint(1, 28) 
    hour = random.randint(0, 23) 
    minute = random.randint(0, 59) 

    my_instance = MyClass() 
    my_instance.my_datetime = datetime(2011, month, day, hour, minute) 

    session.add(my_instance) 

session.commit() 
session.close() 

# Problem starts here 

session = Session() 
literal_datetime = datetime(2011, 06, 14, 12, 30) 
print session.query(sa.func.min(MyClass.my_datetime)).one() # OK 
print session.query(sa.func.min(MyClass.my_datetime, literal_datetime)).all() # Error in MySQL 

私は、SQLの専門家ではないが、データベースの移植は私にとって重要であるため、将来的にこのような落とし穴を回避する方法上の任意のヒントを歓迎いたします。

答えて

0

の表現を使用してください。これはmySqlSQLiteの両方でサポートされています。

min/maxの機能SQLiteは、複数の値に対する非集計演算をサポートします。これはmySqlではサポートされていません。

+0

ありがとう、それは実際にMySQLとSQLiteの両方で動作します。 – RobM

関連する問題