2013-03-22 8 views
5

Come posso riscrivere la seguente istruzione sql con sqlalchemy in python. Ho cercato 30 minuti ma non ho ancora trovato soluzioni.Utilizzo di DATEADD in sqlalchemy

DATEADD(NOW(), INTERVAL 1 DAY) 

o

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

Grazie in anticipo

risposta

6

SQLAlchemy Date automagicamente mappa di oggetti datetime Python, così si dovrebbe solo essere in grado di fare:

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

purtroppo sistema di data di SQLAlchemy non si costringere automaticamente in funcitons specifici di piattaforma come DATEADD() al momento. Solo su Postgresql con psycopg2 (e forse anche mysql) la semplice aritmetica data come sopra traduce in ciò che il DB si aspetta. – zzzeek

3

Doobeh mi ha picchiato ad esso mentre stavo scrivendo, ecco un esempio di boccetta-sqlalchemy che stavo per pubblicare però (per complimentarmi lo SQLAlchemy chiaro esempio):

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) 

Si può passare default come troppo callable:

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

Per completezza, ecco come ci si genera che SQL esatto con l'utilizzo sqlalchemy.sql.func:

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())) 

che si traduce in:

>>> 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)' 

In alternativa è possibile utilizzare un oggetto text() per specificare l'intervallo invece:

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

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

Vale la pena notare che [i documenti dichiarano che 'Intervallo'] (http://docs.sqlalchemy.org/en/latest/core/type_basics.html#sqlalchemy.types.Interval) funziona solo con alcuni DB e il' testo 'Potrebbe essere necessaria la versione per quelli. – wbyoung

+0

@wbyoung: poiché l'OP indicava l'espressione SQL esatta che volevano utilizzare nella domanda, era sicuro assumere che stessero usando un database che supporta la sintassi. Gli altri database –

+0

supportano 'DATEADD (NOW(), INTERVAL 1 DAY)', ovvero MySQL, ma SQLAlchemy non funziona perché l'adattatore ha problemi con il tipo. – 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()