Actualmente estoy comenzando con sqlalchemy. En mi proyecto actual, tengo que hacer una parte con Flask y otra parte desde la línea de comandos. La parte sobre el matraz se ejecuta correctamente, interconectando con sqlalchemy y todo, pero la parte de la línea de comandos no lo está.SQLAlchemy espera un objeto, pero encuentra una tabla
El error que estoy recibiendo es
ArgumentError("Class object expected, got 'Table('documentos',
MetaData(bind=Engine(postgresql://user:[email protected]/clasificador)),
Column('id', Integer(), table=<documentos>, primary_key=True, nullable=False),
Column('nombre', String(length=248), table=<documentos>), schema=None)'.",)
He probado suerte con Google y la lectura sqlalchemy declarativa, pero no puedo encontrar lo que podría ser el problema. El código en el módulo es:
from sqlalchemy.orm import sessionmaker
from db import engine,Base
#some other code
session = sessionmaker(bind=engine)
doc = modelos.documento.Documento(os.path.basename(nelto))
session.add(doc) #here fails
session.remove()
db es el módulo en el que tengo el código común para sqlalchemy. la mayor parte proviene de la documentación del matraz, y db_session se usa solo para el matraz, hice una sesión diferente para el otro módulo.
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
sqldebug=True
engine = create_engine(
'postgresql://user:[email protected]/clasificador',
convert_unicode=True,
echo=sqldebug)
db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine))
Base = declarative_base(bind=engine)
Base.query = db_session.query_property()
Finalmente, aquí está el módulo "documento", aunque dudo que el problema esté aquí. de la Columna de importación sqlalchemy, entero, cadena de db Base importación
class Documento(Base):
'''Clase definiendo los documentos'''
__tablename__ = "documentos"
id = Column(Integer,primary_key=True)
nombre = Column(String(248))
def __init__(self,nombre):
self.nombre = nombre
def __repr__(self):
return '<Documento %r>' % self.nombre
Algunos de los comentarios/nombres están en español, pero creo que se puede ignorar de forma segura, si es necesario, voy a hacer las traducciones
siguiente código de Lafada he creado otro archivo con sólo:
from sqlalchemy.orm import sessionmaker
from modelos.documento import Documento
from db import Base, engine
import os
Session = sessionmaker(bind=engine)
session = Session()
doc = Documento(os.path.basename('/tmp/test.py')) #here fails
session.add(doc)
session.commit()
y funciona muy bien. La única diferencia que puedo detectar es cómo se crea la sesión, la he modificado también en mi código original, pero sigue recibiendo el mismo error.
Encontré el culpable, no estaba en el código que estoy mostrando, pero en una clase diferente que estaba tratando de crear una relación con él pero vinculándose a la mesa en lugar del objeto. Hasta que probé varias otras cosas, no pude encontrar el verdadero problema
Esto es raro, he ejecutado su código (cambiándolo a postgres) y funciona bien, lo he reorganizado a solo lo siguiente y todavía se ejecuta (con las importaciones a otro partes de mi código) Session = sessionmaker (bind = engine) session = Session() doc = Documento (os.path.basename ('/ tmp/test.py')) session.add (doc) # aquí falla session.commit() – Willyfrog
He modificado la pregunta original para agregar el nuevo código, ya que no se puede ver correctamente aquí – Willyfrog
Finalmente reescribí todo el código y funcionó, es casi lo mismo en diferentes archivos. Así que le doy la respuesta, ya que nunca habría tratado de escribirlo en otro archivo (y no debería ser una solución) – Willyfrog