2012-04-18 7 views
6

Debo mencionar primero que estoy usando SqlAlchemy a través de Flask-SqlAlchemy. No creo que esto afecte el problema, pero si lo hace, házmelo saber.SqlAlchemy no aceptará el valor datetime.datetime.now en una columna DateTime

Aquí es la parte relevante del mensaje de error que estoy recibiendo cuando se ejecuta la función create_all en 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'

Aquí es mi modelo:

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

Puede alguien decir cómo Puedo hacer que esto funcione? También probé el siguiente modelo, pero eso tampoco funciona. Mismo error.

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

¿Seguro que la columna 'last_updated' es el problema? ¿Podría ser la columna 'feed_data' (que es la columna 4 si comienzas a contar desde cero)? Después de todo, estás tratando de poner un diccionario (el resultado de 'feedparser.parse (...)' en una columna del tipo de Texto. – srgerg

+0

bueno, esto no tiene nada que ver con la pregunta, ¿podrías avisarme? , de dónde empezar si quiero un diseño ORM simple. – user993563

+0

Creo que debería usar sqlalchemy.func.now() en lugar de datetime.datetime.now() – utapyngo

Respuesta

-8

mirada a su línea:

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

No hay datetime.datetime.now atributo en pitón. Sin embargo, hay es una datetime.datetime.now()función en python. Solo estabas perdiendo un par de paréntesis.

+6

No, sqlalchemy requiere un callable. Si agrega los paréntesis , obtienes un valor constante para todas las entradas. –

+2

@adamek 'something.myfunc' devuelve la función en sí, sin llamarlo, este es el comportamiento deseado. Si llamaras a la función, estarías recuperando solo una vez y usando eso como el predeterminado, que es un comportamiento diferente y no deseado. –

13

Intente utilizar datetime.datetime.utcnow(). Esto funciona para mí

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

creo que esto va a funcionar

0

Establecer la importación a cabo la clase.

from datetime import datetime 

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

o

import datetime 

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

lo hice

Cuestiones relacionadas