Я сейчас начинаю с sqlalchemy. В моем текущем проекте мне нужно сделать какую-то часть с Flask, а другую часть из командной строки. Часть о фляге работает нормально, взаимодействует с sqlalchemy и всем, но часть командной строки - нет.
Я получаю ошибку
ArgumentError("Class object expected, got 'Table('documentos',
MetaData(bind=Engine(postgresql://user:password@localhost/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:passwd@localhost/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()
Наконец, здесь находится модуль «documentmento», хотя я сомневаюсь, что проблема здесь.
из sqlalchemy import Column, Integer, String
из базы данных импорта базы данных
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()
и все работает отлично. Единственное отличие, которое я могу заметить, это то, как создается сессия, я также изменил это в своем исходном коде, но он продолжает получать ту же ошибку.
Я нашел виновника, он был не в коде, который я показываю, а в другом классе, который пытался создать с ним связь, но связывал его с таблицей, а не с объектом. Пока я не попробовал несколько других вещей, я не мог отследить это до настоящей проблемы