2013-03-22 13 views
5

Wie kann ich die folgende SQL-Anweisung mit SQLALCHEMY in Python umschreiben. Ich habe 30 Minuten gesucht, konnte aber immer noch keine Lösungen finden.Verwendung von DATEADD in sqlalchemy

DATEADD(NOW(), INTERVAL 1 DAY) 

oder

INSERT INTO dates (expire) 
VALUES(DATEADD(NOW(), INTERVAL 1 DAY)) 

Vielen Dank im Voraus

Antwort

6

SQLAlchemy automagically zu Python Datetime-Objekte Karte Daten, so dass Sie nur in der Lage sein sollte, zu tun:

from sqlalchemy import Table, Column, MetaData, DateTime 
from datetime import datetime, timedelta 

metadata = MetaData() 
example = Table('users', metadata, 
    Column('expire', DateTime) 
) 

tomorrow = datetime.now() + timedelta(days=1) 

ins = example.insert().values(expire=tomorrow) 
+0

leider SQLAlchemy Datum des Systems nicht automatisch coerce in plattformspezifische funcitons wie DATEADD() ein. Nur auf Postgresql mit psycopg2 (und vielleicht auch mysql) übersetzt einfache Datumsarithmetik wie oben in das, was die DB erwartet. – zzzeek

3

Doobeh schlug mich während ich getippt habe, hier ist ein flaschen-sqlalchemy-Beispiel, das ich veröffentlichen wollte (um es zu ergänzen) die Ebene sqlalchemy Beispiel):

from flask.ext.sqlalchemy import SQLAlchemy 
from datetime import datetime, timedelta 

db = SQLAlchemy() 

class Thing(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    created = db.Column(db.DateTime) 

c = Thing(created = datetime.utcnow() + timedelta(days=1)) 
print repr(c.created) 
# datetime.datetime(2013, 3, 23, 15, 5, 48, 136583) 

Sie Standard als aufrufbar auch passieren kann:

from flask.ext.sqlalchemy import SQLAlchemy 
from datetime import datetime, timedelta 

db = SQLAlchemy() 

def tomorrow(): 
    return datetime.utcnow() + timedelta(days=1) 

class Thing(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    publish_date = db.Column(db.DateTime, default=tomorrow) 
22

Der Vollständigkeit halber ist hier, wie Sie diese genaue SQL mit der Verwendung von sqlalchemy.sql.func erzeugen würde:

from sqlalchemy.sql import func 
from sqlalchemy.sql.expression import bindparam 
from sqlalchemy import Interval 

tomorrow = func.dateadd(func.now(), bindparam('tomorrow', timedelta(days=1), Interval())) 

die Ergebnisse:

>>> from sqlalchemy.sql import func 
>>> func.dateadd(func.now(), bindparam('tomorrow', timedelta(days=1), Interval(native=True))) 
<sqlalchemy.sql.expression.Function at 0x100f559d0; dateadd> 
>>> str(func.dateadd(func.now(), bindparam('tomorrow', timedelta(days=1), Interval(native=True)))) 
'dateadd(now(), :tomorrow)' 

Alternativ könnten Sie ein text()-Objekt verwenden, um das Intervall zu spezifizieren statt:

from sqlalchemy.sql import func 
from sqlalchemy.sql.expression import text 

tomorrow = func.dateadd(func.now(), text('interval 1 day')) 
+0

Es ist erwähnenswert, dass [die Dokumentation besagt, dass "Interval"] (http://docs.sqlalchemy.org/en/latest/core/type_basics.html#sqlalchemy.types.Interval) nur mit bestimmten DBs und dem 'text funktioniert 'Version kann für diese benötigt werden. – wbyoung

+0

@wbyoung: Da der OP den genauen SQL-Ausdruck angegeben hat, den er in der Frage verwenden wollte, konnte man davon ausgehen, dass er eine Datenbank verwendet, die die Syntax unterstützt. –

+0

andere Datenbanken unterstützen 'DATEADD (NOW(), INTERVAL 1 DAY)', d. H. MySQL, aber SQLAlchemy nicht, weil der Adapter Probleme mit dem Typ hat. – wbyoung

0
from datetime import datetime, timedelta 
from dateutil import tz 

new_date = datetime.now(tz=tz.tzlocal()) + timedelta(days=1) 
new_item = Expire(expire=new_date) 
session.save(new_item) 
session.commit() 
Verwandte Themen