Obecnie zaczynam od Sqlalchemy. W moim obecnym projekcie muszę zrobić część z kolbą i inną częścią z linii poleceń. Część o kolbie działa dobrze, łącząc SQLalchemy i wszystko, ale część poleceń nie jest.

Pojawia się błąd

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)'.",)

Próbowałem szczęścia z Google i czytając deklaratywną SQLalchemy, ale nie mogę znaleźć tego, co może być problemem. Kod w module to:

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 jest modułem, w którym mam wspólny kod dla SQLalchemy. Większość z nich pochodzi z dokumentacji kolby, a DB_Session jest używany tylko do kolby, wykonałem inną sesję dla innego modułu.

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()

Wreszcie tutaj jest moduł "dokumento", chociaż wątpię, że problem jest tutaj. Z kolumny Import SQLalchemy, liczbę całkowitą, ciąg z bazy importu DB

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

Niektóre komentarze / nazwy są w języku hiszpańskim, ale myślę, że możesz je bezpiecznie zignorować, jeśli to konieczne, zrobię tłumaczenia

Po kodzie Lafada stworzyłem inny plik za pomocą:

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()

I działa dobrze. Jedyną różnicą, którą mogę zauważyć, jest sposób tworzenia sesji, zmodyfikowałem, że również w moim oryginalnym kodzie, ale utrzymuje ten sam błąd.

Znalazłem winprit, nie było na kodzie, który pokazuję, ale w innej klasie, która próbowała stworzyć związek z nim, ale łącząc się z tabelą zamiast obiektu. Dopóki nie próbowałem kilku innych rzeczy, nie mogłem prześledzić tego prawdziwym problemem

12
Willyfrog 17 listopad 2011, 20:05

2 odpowiedzi

Widziałem ten błąd, jeśli zapomnę, że ForeignKey() ma nazwę tabeli bazy danych, ale relationship() ma zamiast nazwy klasy Orm. To znaczy, czasami piszę:

movie_id = Column(Integer, ForeignKey('movie.id'))
movie = relationship('movie')  # WRONG!
# Exception: "SQLAlchemy expects to find an object…"

Zamiast tego powinienem pisać, zakładając, że movie jest nazwą tabeli bazy danych (nie jest to, że SQL zwraca uwagę na kapitalizację nazwy tabeli!) I to {X1}} jest nazwą mojej klasy Python Orm :

movie_id = Column(Integer, ForeignKey('movie.id'))
movie = relationship('Movie')  # Works!
28
Brandon Rhodes 4 marzec 2012, 21:23

Nie jestem tak zaznajomiony z Sqlalchemy i jego formatem deklaratywnym, ale myślę, że myślę, że nie jest poprawny, że nadpisujesz metodę init bez wywołania klasy jego rodzica (tutaj jest Base).

Usuń init lub zadzwoń Base.init(self).

0
Nightfirecat 17 listopad 2011, 21:33