2011-11-17 9 views
12

पाता है मैं वर्तमान में sqlalchemy से शुरू कर रहा हूं। मेरे वर्तमान प्रोजेक्ट में मुझे फ्लास्क और कमांड लाइन से कुछ अन्य भाग के साथ कुछ हिस्सा करना है। फ्लास्क के बारे में हिस्सा ठीक चल रहा है, sqlalchemy और सभी के साथ इंटरफेसिंग, लेकिन कमांडलाइन हिस्सा नहीं है।SQLAlchemy किसी ऑब्जेक्ट की अपेक्षा करता है, लेकिन एक तालिका

त्रुटि मैं हो रही है

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

मैं गूगल और पढ़ने कथात्मक 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:[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() 

अंत में, यहाँ "Documento" मॉड्यूल है, हालांकि मुझे शक समस्या यहाँ है। SQLAlchemy आयात कॉलम, पूर्णांक, डाटाबेस आयात बेस से स्ट्रिंग से

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

और यह सिर्फ ठीक चलाता है। एकमात्र अंतर जो मैं खोज सकता हूं वह यह है कि सत्र कैसे बनाया जाता है, मैंने इसे अपने मूल कोड में भी संशोधित किया है, लेकिन यह वही त्रुटि प्राप्त करता रहता है।

मुझे अपराधी मिला, यह उस कोड पर नहीं था जो मैं दिखा रहा हूं, लेकिन एक अलग वर्ग में जो इसके साथ संबंध बनाने की कोशिश कर रहा था लेकिन वस्तु के बजाय तालिका से जुड़ रहा था। जब तक मैं कई अन्य बातों की कोशिश की मैं इसे वास्तविक समस्या

उत्तर

6

मैं mysql पर अपने कोड की कोशिश की (मैं न मेरे पीसी :(में postgress है)। मुझे लगता है कि कोड डाल रहा हूँ कृपया यहां देखते है कि मेरे लिए ठीक काम कर रहा है क्योंकि वह है।

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

आउटपुट लॉग

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 में एक नया रिकार्ड जोड़ देगा। यदि आप किसी अन्य प्रश्न तो अपनी अच्छी है, तो अगर मैं आपको लगता है कि :)

+0

यह अजीब बात है, मैंने अपना कोड चलाया है (इसे पोस्टग्रेस में बदल रहा है) और यह ठीक चलता है, मैंने इसे केवल निम्नलिखित में पुन: व्यवस्थित किया है और यह अभी भी चलता है (जबकि दूसरे के आयात मेरे कोड के कुछ हिस्सों) सत्र = सत्र निर्माता (बाइंड = इंजन) सत्र = सत्र() दस्तावेज़ = दस्तावेज़ (os.path.basename ('/ tmp/test.py')) session.add (doc) # यहां session.commit() – Willyfrog

+0

विफल हो गया है, मैंने नया कोड जोड़ने के लिए मूल प्रश्न को संशोधित किया है, क्योंकि इसे ठीक से नहीं देखा जा सकता है – Willyfrog

+2

मैं अंततः सभी कोड को फिर से लिखता हूं और यह काम करता है, यह लगभग विभिन्न फ़ाइलों में समान है। इसलिए मैं आपको प्रतिक्रिया देता हूं क्योंकि मैंने इसे किसी अन्य फ़ाइल में लिखने की कोशिश नहीं की होगी (और समाधान नहीं होना चाहिए) – Willyfrog

0

का पता लगाने नहीं कर सकता मैं मुझे लगता है कि फोन करने के बिना सही आप init विधि अधिलेखित कर रहे हैं नहीं है SQLAlchemy और उसके कथात्मक प्रारूप लेकिन एक बात के साथ इतना परिचित नहीं हूँ इसके माता-पिता की कक्षा (यहां यह Base है)।

init हटाएं या Base.init(self) पर कॉल करें।

+0

कि भाग के लिए, मैं [कुप्पी] से ट्यूटोरियल का पालन किया (http://flask.pocoo.org/docs/patterns/sqlalchemy/) और यह काम करता है जब मैं कुप्पी का उपयोग शिकायत के बिना। वैसे भी धन्यवाद :) – Willyfrog

+0

ठीक है लेकिन याद रखें कि फ्लास्क आपको उस विधि को परिभाषित करने के लिए कुछ जोड़ सकता है। शुद्ध पायथन + स्क्लेल्चेमी में जो काम नहीं कर सकता है! – dario

+0

किसी भी अन्य मामले में मैं कहूंगा कि आप सबसे अधिक सही हैं, लेकिन यहां तक ​​कि स्क्लेक्लेमी ट्यूटोरियल भी इस तरह से करता है, इसलिए मुझे विश्वास था कि समस्या नहीं थी। वैसे भी इसे इंगित करने के लिए धन्यवाद :) – Willyfrog

28

मुझे लगता है कि त्रुटि देखा है में मदद मुझे लगता है कि भूल से पहले अगर ForeignKey() डेटाबेस तालिका-और-फ़ील्ड का नाम लेता है लेकिन relationship() इसके बजाए एक ओआरएम क्लास का नाम लेता है।यही कारण है, मैं कभी कभी लिखें:

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

क्या मैं बजाय, लेखन यह सोचते हैं कि movie डेटाबेस तालिका का नाम (न कि SQL तालिका नाम पूंजीकरण की ओर ध्यान देता!) है होना चाहिए और उस Movie का नाम है मेरी पायथन ORM वर्ग, है:

movie_id = Column(Integer, ForeignKey('movie.id')) 
movie = relationship('Movie') # Works! 
+4

वाह, इसके लिए एक बिलियन। मैंने यह सही काम किया। यह असंगतता भयानक है। – andronikus

+0

वास्तव में, धन्यवाद! – AME

+2

कोई ऐसा सोच सकता है कि sqlalchemy उस तरह की गलती के लिए एक बेहतर त्रुटि संदेश उत्सर्जित कर सकता है। वास्तव में, आज इस पर काट दिया गया है, मैं एक बग रिपोर्ट पोस्ट करूंगा। –

संबंधित मुद्दे