Attualmente sto iniziando con SQLAlchemy. Nel mio progetto attuale devo fare una parte con Flask e qualche altra parte dalla riga di comando. La parte relativa al pallone funziona bene, si interfaccia con sqlalchemy e tutto, ma la parte commandline non lo è.SQLAlchemy si aspetta un oggetto, ma trova una tabella
L'errore che sto ottenendo è
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)'.",)
ho provato la mia fortuna con Google e la lettura SQLAlchemy dichiarativa, ma non riesco a trovare quello che potrebbe essere il problema. Il codice nel modulo è:
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 è il modulo in cui ho il codice comune per SQLAlchemy. la maggior parte proviene dalla documentazione del pallone e db_session è usato solo per il pallone, ho fatto una sessione diversa per l'altro modulo.
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()
Infine, ecco il modulo "documento", anche se dubito che il problema sia qui. da Colonna SQLAlchemy importazione, Integer, String da db Base importazione
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
Alcuni dei commenti/nomi sono in spagnolo, ma penso che si possono tranquillamente ignorare, se è necessario, farò le traduzioni
seguito il codice di Lafada ho creato un altro file con un semplice:
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()
e funziona bene. L'unica differenza che posso individuare è come viene creata la sessione, l'ho modificata anche nel mio codice originale, ma continua a generare lo stesso errore.
Ho trovato il colpevole, non era sul codice che sto mostrando, ma in una classe diversa che stava cercando di creare una relazione con esso, ma il collegamento al tavolo invece dell'oggetto. Fino a quando ho provato diverse altre cose, non riuscivo a rintracciarlo al vero problema
Questo è strano, ho eseguito il tuo codice (cambiandolo in postgres) e funziona bene, l'ho riorganizzato al seguente e continua a funzionare (con le importazioni in altri parti del mio codice) Session = sessionmaker (bind = motore) session = Session() doc = documento (os.path.basename ('/ tmp/test.py')) session.add (doc) # qui fallisce session.commit() – Willyfrog
Ho modificato la domanda originale per aggiungere il nuovo codice, in quanto non può essere visto correttamente qui – Willyfrog
Ho finalmente riscritto tutto il codice e ha funzionato, è quasi la stessa in diversi file. Quindi ti premo la risposta come non avrei mai provato a scriverlo in un altro file (e non dovrebbe essere una soluzione) – Willyfrog