Сейчас я начинаю с sqlalchemy. В моем текущем проекте мне нужно сделать часть с Flask и другой частью из командной строки. Часть о колбе работает нормально, взаимодействует с sqlalchemy и все, но часть командной строки не является.
Ошибка, которую я получаю,
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)'.",)
Я пробовал свою удачу с Google и читаю декларативную sqlalchemy, но я не могу найти, что может быть проблемой. Код в модуле:
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 - это модуль, в котором у меня есть общий код для sqlalchemy. большая часть из них поступает из документации флагов, а db_session используется только для фляжки, я сделал другой сеанс для другого модуля.
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()
Наконец, вот модуль "documento", хотя я сомневаюсь, что проблема здесь. из sqlalchemy import Column, Integer, String from db import Base
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
Некоторые комментарии/имена на испанском языке, но я думаю, что вы можете смело игнорировать их, если это необходимо, я сделаю переводы
Следуя коду Lafada, я создал еще один файл:
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()
и он работает просто отлично. Единственное различие, которое я могу заметить, это то, как создается сеанс, я также изменил это в своем исходном коде, но он продолжает получать ту же ошибку.
Я нашел виновника, это не было в коде, который я показываю, но в другом классе, который пытался создать с ним отношения, но ссылался на таблицу вместо объекта. Пока я не попробовал несколько других вещей, я не мог отследить его до реальной проблемы.