2012-04-18 7 views
6

Ich sollte zuerst erwähnen, dass ich SqlAlchemy durch Flask-SqlAlchemy verwende. Ich glaube nicht, dass dies das Problem beeinflusst, aber wenn es so ist, lass es mich wissen.SqlAlchemy wird datetime.datetime.now Wert in einer DateTime Spalte nicht akzeptieren

Hier ist der relevante Teil der Fehlermeldung, die ich bekommen habe, wenn die create_all Funktion in sqlalchemy

läuft

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'

Hier mein Modell:

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

Kann mir jemand sagen, wie Ich kann das zur Arbeit bringen? Ich habe auch das folgende Modell ausprobiert, aber das funktioniert auch nicht. Derselbe Fehler.

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

Sind Sie sicher, dass die 'last_updated' Spalte ist das Problem? Könnte es die 'feed_data'-Spalte sein (was ist Spalte 4, wenn Sie anfangen, von Null zu zählen)? Du versuchst schließlich, ein Wörterbuch (das Ergebnis von 'feedparser.parse (...)' in eine Spalte vom Typ Text zu setzen.) – srgerg

+0

nun, das hat nichts mit der Frage zu tun, kannst du es mich bitte wissen lassen , wo ich anfangen soll, wenn ich ein einfaches ORM-Layout haben möchte – user993563

+0

Ich denke, Sie sollten sqlalchemy.func.now() anstelle von datetime.datetime.now() verwenden – utapyngo

Antwort

-8

Blick auf Ihre Linie:

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

Es gibt keine datetime.datetime.now Attribut in Python. Jedoch gibt eine datetime.datetime.now()Funktion in Python. Du hast gerade ein Paar Klammern verpasst.

+6

Nein, sqlalchemy erfordert eine aufrufbar. Wenn Sie die Klammern hinzufügen , erhalten Sie einen konstanten Wert für alle Einträge –

+2

@adamek 'something.myfunc' gibt die Funktion selbst zurück, ohne sie aufzurufen, das ist das gewünschte Verhalten Wenn Sie die Funktion aufrufen, würden Sie nur ein einziges Mal abrufen und verwenden als Standard, was ein anderes Verhalten und nicht erwünscht ist. –

13

Versuchen Sie, datetime.datetime.utcnow() zu verwenden. Das funktioniert für mich.

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

Ich denke, das

0

Stellen Sie den Import aus der Klasse arbeiten.

from datetime import datetime 

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

oder

import datetime 

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

Ich habe diese

Verwandte Themen