2013-03-22 28 views
5

Làm thế nào tôi có thể viết lại câu lệnh sql sau bằng sqlalchemy trong python. Tôi đã tìm kiếm 30 phút nhưng vẫn không thể tìm thấy bất kỳ giải pháp nào.Sử dụng DATEADD trong sqlalchemy

DATEADD(NOW(), INTERVAL 1 DAY) 

hoặc

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

Cảm ơn trước

Trả lời

6

SQLAlchemy vị automagically bản đồ các đối tượng datetime Python, vì vậy bạn chỉ có thể làm:

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

không may hệ thống ngày SQLAlchemy sẽ không tự động ép buộc vào funcitons cụ nền tảng như DATEADD() ngay bây giờ. Chỉ trên Postgresql với psycopg2 (và có lẽ mysql cũng) làm số học ngày đơn giản như trên dịch thành những gì DB mong đợi. – zzzeek

3

Doobeh đánh tôi với nó trong khi tôi đang gõ, đây là một ví dụ bình phương-sqlalchemy tôi sẽ gửi mặc dù (để khen các SQLAlchemy đồng bằng ví dụ):

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) 

Bạn có thể vượt qua mặc định như một callable quá:

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

Đối với đầy đủ lợi ích, đây là cách bạn muốn tạo ra rằng SQL chính xác với việc sử dụng 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())) 

kết quả là:

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

Hoặc bạn có thể sử dụng một đối tượng text() để xác định khoảng thời gian thay vì:

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

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

Cần lưu ý rằng [các tài liệu tuyên bố rằng 'Interval'] (http://docs.sqlalchemy.org/en/latest/core/type_basics.html#sqlalchemy.types.Interval) chỉ hoạt động với một số DB và' văn bản 'phiên bản có thể được yêu cầu cho những người. – wbyoung

+0

@wbyoung: vì OP đã chỉ ra biểu thức SQL chính xác mà họ muốn sử dụng trong câu hỏi, nên an toàn cho rằng họ đang sử dụng cơ sở dữ liệu hỗ trợ cú pháp. –

+0

các cơ sở dữ liệu khác hỗ trợ 'DATEADD (NOW(), INTERVAL 1 DAY)', tức là MySQL, nhưng SQLAlchemy không phải vì bộ điều hợp có vấn đề với kiểu. – 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() 
Các vấn đề liên quan