2012-04-18 10 views
6

Najpierw powiem, że używam SqlAlchemy przez Flask-SqlAlchemy. Nie sądzę, żeby miało to wpływ na sprawę, ale jeśli tak, proszę dać mi znać.SqlAlchemy nie zaakceptuje wartości datetime.datetime.now w kolumnie DateTime

Oto odpowiednia część komunikatu o błędzie dostaję po uruchomieniu funkcji create_all w sqlalchemy

InterfaceError: (InterfaceError) Error binding parameter 4 - probably unsupported type. u'INSERT INTO podcasts (feed_url, title, url, last_updated, feed_data) VALUES (?, ?, ?, ?, ?)' (u'http://example.com/feed', u'Podcast Show Title', u'http://example.com', '2012-04-17 20:28:49.117000'

Oto mój model:

class Podcast(db.Model): 
    import datetime 
    __tablename__ = 'podcasts' 
    id = db.Column(db.Integer, primary_key=True) 
    feed_url = db.Column(db.String(150), unique=True) 
    title = db.Column(db.String(200)) 
    url = db.Column(db.String(150)) 
    last_updated = db.Column(db.DateTime, default=datetime.datetime.now) 
    feed_data = db.Column(db.Text) 

    def __init__(self, feed_url): 
     import feedparser 

     self.feed_url = feed_url 
     self.feed_data = feedparser.parse(self.feed_url) 
     self.title = self.feed_data['feed']['title'] 
     self.url = self.feed_data['feed']['link'] 

Czy ktoś może mi powiedzieć jak Mogę to uruchomić? Próbowałem również następujący model, ale to również nie działa. Ten sam błąd.

class Podcast(db.Model): 
    import datetime 
    __tablename__ = 'podcasts' 
    id = db.Column(db.Integer, primary_key=True) 
    feed_url = db.Column(db.String(150), unique=True) 
    title = db.Column(db.String(200)) 
    url = db.Column(db.String(150)) 
    last_updated = db.Column(db.DateTime) 
    feed_data = db.Column(db.Text) 

    def __init__(self, feed_url): 
     import feedparser 

     self.feed_url = feed_url 
     self.feed_data = feedparser.parse(self.feed_url) 
     self.last_updated = datetime.datetime.now() 
     self.title = self.feed_data['feed']['title'] 
     self.url = self.feed_data['feed']['link'] 
+3

Czy jesteś pewien, że 'last_updated' kolumna jest problem? Czy może to być kolumna 'feed_data' (kolumna 4, jeśli zaczynasz odliczanie od zera)? Przecież próbujesz umieścić słownik (wynik 'feedparser.parse (...)' w kolumnie typu Tekst. – srgerg

+0

cóż, to nie ma nic wspólnego z pytaniem, czy mógłbyś dać mi znać? , od czego zacząć, jeśli chcę prosty układ ORM – user993563

+0

Myślę, że powinieneś używać sqlalchemy.func.now() zamiast datetime.datetime.now() – utapyngo

Odpowiedz

-8

Spójrz na linii:

last_updated = db.Column(db.DateTime, default=datetime.datetime.now) 

Nie ma datetime.datetime.now atrybut w Pythonie. Jednak w pythonie występuje w postaci a datetime.datetime.now(). Właśnie przegapiłeś parę nawiasów.

+6

Nie, sqlalchemy wymaga wywołania.Jeśli dodać nawiasy , otrzymujesz stałą wartość dla wszystkich wpisów –

+2

@adamek 'something.myfunc' zwraca samą funkcję, bez wywoływania jej, jest to pożądane zachowanie.Jeśli wywołasz tę funkcję, będziesz pobierać tylko jeden raz i używając tego jako domyślny, który jest innym zachowaniem i nie jest pożądany. –

13

Spróbuj użyć datetime.datetime.utcnow(). To działa dla mnie.

5
last_updated = db.Column(db.DateTime, default=db.func.current_timestamp()) 

myślę, że to będzie działać

0

Ustaw import zewnątrz klasy.

from datetime import datetime 

last_updated = db.Column(db.DateTime, default=datetime.now()) 

lub

import datetime 

last_updated = db.Column(db.DateTime, default=datetime.datetime.now()) 

Zrobiłem to

Powiązane problemy