2011-11-17 14 views
12

Şu anda sqlalchemy ile başlıyorum. Benim şu anki projemde Flask ve komut satırından başka bir bölümle biraz uğraşmam gerekiyor. Şişeye ilişkin bölüm, iyi çalışıyor, sqlalchemy ile bütünleşiyor, ama komuta parçası değil.SQLAlchemy bir nesneyi bekliyor, ancak bir tablo buluyor

alıyorum hata ben google ve okuma bildirime sqlalchemy şansımı denedim

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

, ama sorun ne olabilir bulamıyorum. modülünde kod şudur:

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 ben sqlalchemy için ortak kod var modülüdür. Bunun çoğu flask dokümantasyonundan gelir ve db_session sadece flask için kullanılır, diğer modül için farklı bir seans yaptım.

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

Son olarak, burada "documento" modülü var, ancak burada sorun olduğundan şüphe duyuyorum. sqlalchemy ithalat Sütun, Integer, db ithal Üssü'nden dize den

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 

yorumların bazıları/isimleri İspanyolca, ama zaten gerekli eğer ben çeviriler yapacağım, güvenle onları görmezden düşünüyorum

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

ve sadece iyi çalışır: sadece sahip başka bir dosya oluşturduk Lafada koduna ardından

. Belirleyebileceğim tek fark, oturumun nasıl oluşturulduğu, orijinal kodumda da değiştirdim, ama aynı hatayı almayı sürdürüyor.

Suçlu buldum, gösterdiğim kodda değildi, ancak bununla bir ilişki oluşturmaya çalışan ancak nesne yerine tabloya bağlanan farklı bir sınıfta. Ben diğer birçok şeyi denedim kadar gerçek sorunu

cevap

6

(benim pc :(içinde postgres Dont have). Ben kontrol ediniz kodu buraya koyuyorum bu benim için iyi çalışıyor yani çünkü.

#filename: /tmp/test.py 
from sqlalchemy import create_engine, Column, Integer, String 
from sqlalchemy.orm import scoped_session, sessio 

nmaker 
from sqlalchemy.ext.declarative import declarative_base 
import os 

sqldebug=True 

engine = create_engine('mysql://test:[email protected]/test1', 
      convert_unicode=True, 
      echo=sqldebug) 

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

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 

Base.metadata.create_all(engine) 


from sqlalchemy.orm import sessionmaker 
#some other code 
Session = sessionmaker(bind=engine) 
session = Session() 
doc = Documento(os.path.basename('/tmp/test.py')) 
session.add(doc) #here fails 
session.commit() 

Çıktı günlüğü

log gereğince
In [11]: ed /tmp/test.py 
Editing... done. Executing edited code... 
2011-11-18 08:48:41,254 INFO sqlalchemy.engine.base.Engine SELECT DATABASE() 
2011-11-18 08:48:41,254 INFO sqlalchemy.engine.base.Engine() 
2011-11-18 08:48:41,259 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'character_set%%' 
2011-11-18 08:48:41,259 INFO sqlalchemy.engine.base.Engine() 
2011-11-18 08:48:41,290 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names' 
2011-11-18 08:48:41,290 INFO sqlalchemy.engine.base.Engine() 
2011-11-18 08:48:41,320 INFO sqlalchemy.engine.base.Engine SHOW COLLATION 
2011-11-18 08:48:41,320 INFO sqlalchemy.engine.base.Engine() 
2011-11-18 08:48:41,339 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode' 
2011-11-18 08:48:41,339 INFO sqlalchemy.engine.base.Engine() 
2011-11-18 08:48:41,343 INFO sqlalchemy.engine.base.Engine DESCRIBE `documentos` 
2011-11-18 08:48:41,343 INFO sqlalchemy.engine.base.Engine() 
2011-11-18 08:48:41,389 INFO sqlalchemy.engine.base.Engine ROLLBACK 
2011-11-18 08:48:41,391 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE documentos (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    nombre VARCHAR(248), 
    PRIMARY KEY (id) 
) 


2011-11-18 08:48:41,391 INFO sqlalchemy.engine.base.Engine() 
2011-11-18 08:48:41,683 INFO sqlalchemy.engine.base.Engine COMMIT 
2011-11-18 08:48:41,698 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) 
2011-11-18 08:48:41,700 INFO sqlalchemy.engine.base.Engine INSERT INTO documentos (nombre) VALUES (%s) 
2011-11-18 08:48:41,700 INFO sqlalchemy.engine.base.Engine ('test.py',) 
2011-11-18 08:48:41,701 INFO sqlalchemy.engine.base.Engine COMMIT 

, db biri yeni bir rekor ekleyecektir. Bunu :) o hatayı gördük

+0

Bu garip, kodunu çalıştırıyorum (postgres'e değiştiriyorum) ve iyi çalışıyor, sadece aşağıdakilere yeniden düzenledim ve hala çalışıyor benim kod parçaları) oturum = sessionmaker (bağlama = motor) = oturum() doc = Documento (os.path.basename ('/ tmp/test.py' oturum)) session.add (doc) # burada başarısız session.commit() – Willyfrog

+0

Burada düzgün görülemediği için yeni kodu eklemek için orijinal soruyu değiştirdim – Willyfrog

+2

Sonunda tüm kodu yeniden yazdım ve çalıştı, Neredeyse farklı dosyaları aynı. Bu yüzden size başka bir dosyaya yazmayı denemediğimden (ve bir çözüm olmamalı) vereceğim cevabı verdim – Willyfrog

0

izleyemiyorum Ben sqlalchemy ve onun deklaratif formatı ile çok aşina değilim ama doğru olduğunu düşündüğüm bir şey doğru aramaktan init yöntemi üzerine yazıyorsun ebeveyninin sınıfı (işte Base).

init'u kaldırın veya Base.init(self) numaralı telefonu arayın. Ben mysql kodunuzu çalıştı

+0

, ben [şişesi] dan öğretici izledi ve ben şişeyi kullandığınızda çalışır: my Python ORM sınıfıdır şikayet etmeden. Neyse teşekkürler :) – Willyfrog

+0

Tamam ama unutmayın, Flask bu init yöntemini tanımlamanıza izin vermek için bir şeyler ekleyebilir. Çalışamayan saf python + sqlalchemy'de! – dario

+0

başka bir durumda, büyük olasılıkla doğru olduğunu söyleyebilirim, ama sqlalchemy öğretici bu şekilde yapar, bu yüzden sorun değildi emin oldum. Yine de işaret ettiğin için teşekkür ederim :) – Willyfrog

28

size yardımcı eğer o zaman onun iyi başka bir sorgu varsa bunu unutmadan önce, bu kod ForeignKey() bir veritabanı tablosu alan adını alır, ancak relationship() bunun yerine bir ORM sınıfının adını alır.Ben bazen yazmak şöyledir:

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

yerine movie veritabanı tablosu adı (değil SQL tablo adı harf özen!) Olduğunu varsayarak, yazma olmalı ve bu Movie adı ne (http://flask.pocoo.org/docs/patterns/sqlalchemy/)

o kısmı için
movie_id = Column(Integer, ForeignKey('movie.id')) 
movie = relationship('Movie') # Works! 
+4

Vay, bunun için bir milyar +. Ben o şeyi yaptım. Bu tutarsızlık korkunç bir şey. – andronikus

+0

Gerçekten, teşekkürler! – AME

+2

Birisi, bu tür bir hata için sqlalchemy'nin daha iyi bir hata mesajı verebileceğini düşünebilir. Aslında, bugün bu tarafından ısırılmış, bir hata raporu yayınlayacağım. –