Ich beginne derzeit mit Sqlalchemy. In meinem aktuellen Projekt muss ich einen Teil mit Flask und einen anderen Teil über die Kommandozeile erledigen. Der Teil über Flask läuft gut, Schnittstelle mit Sqlalchemy und alle, aber die Kommandozeile Teil ist nicht.
Der Fehler, den ich erhalte, lautet
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)'.",)
Ich habe mein Glück mit Google und Lesen deklarative Sqlalchemy versucht, aber ich kann nicht finden, was das Problem sein könnte. Der Code im Modul ist:
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 ist das Modul, in dem ich den gemeinsamen Code für Sqlalchemy habe. Das meiste davon stammt aus der Flask-Dokumentation, und db_session wird nur für Flask verwendet, ich habe eine andere Sitzung für das andere Modul.
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()
Zum Schluss noch das Modul "documento", obwohl ich bezweifle, dass das Problem hier liegt. from sqlalchemy import Spalte, Ganzzahl, String von db importieren 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
Einige der Kommentare/Namen sind auf Spanisch, aber ich denke, man kann sie getrost ignorieren, wenn es nötig ist, werde ich die Übersetzungen machen
In Anlehnung an den Code von Lafada habe ich eine weitere Datei mit just erstellt:
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()
und es läuft einwandfrei. Der einzige Unterschied, den ich erkennen kann, ist, wie die Sitzung erstellt wird, ich habe geändert, dass auch in meinem ursprünglichen Code, aber es hält immer den gleichen Fehler.
Ich fand den Übeltäter, es war nicht auf den Code, den ich zeige, aber in einer anderen Klasse, die versuchte, eine Beziehung mit ihm zu erstellen, aber die Verknüpfung mit der Tabelle anstelle des Objekts. Bis ich verschiedene andere Dinge ausprobiert habe, konnte ich es nicht auf das eigentliche Problem zurückführen