2013-03-02 7 views
17

Ben sqlalchemy öğreniyorum.SQLAlchemy - declarative_base nedir

Dosya: user.py

from sqlalchemy import Column,Integer,Sequence, String 
from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 
class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer,Sequence('user_seq'),primary_key=True) 
    username = Column(String(50),unique=True) 
    fullname = Column(String(150)) 
    password = Column(String(50)) 
    def __init__(self,name,fullname,password): 
    self.name = name 
    self.fullname = fullname 
    self.password = password 

Dosya main.py Şimdi

from sqlalchemy.orm import sessionmaker 
from sqlalchemy import create_engine 
from user import User 
from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 
if __name__ == '__main__': 
    engine = create_engine('mysql://root:[email protected]:3306/test',echo=True) 
    Base.metadata.create_all(engine, checkfirst=True) 
    Session = sessionmaker(bind=engine) 
    session = Session() 
    ed_user = User('ed', 'Ed Jones', 'edspassword') 
    session.add(ed_user) 
    session.commit() 

koşuyorum main.py. İşte benim ilk koddur Otomatik olarak tablo oluşturamazsınız & 'session.commit()' konusunda istisna ver. Şimdi 'Base = declarative_base()' satırını farklı modül &'a taşıdığımda, main.py & user.py.'de aynı 'Base' değişkenini kullanın. Masa oluşturuyor.

Sorum, "declarative_base" nedir?

+0

Bunu yaptığınızda aldığınız hata nedir? –

cevap

19

declarative_base(), bildirimdeki sınıf tanımları için (örnekte Base değişkenine atanan) bir temel sınıf oluşturan bir fabrika işlevidir. User.py dosyasında yarattığınız kullanıcı User modeliyle ilişkilendirilmişken, diğeri (main.py) farklı bir sınıf ve modelleriniz hakkında bir şey bilmiyor, bu nedenle tabloyu neden Base.metadata.create_all() aramasına sebep olmadı. Sen main.py. yeni Base sınıf oluşturulmasının

from user import User, Base 

yerine user.py gelen Base aktarmanız gerekiyor

+1

Yeni dosya oluşturdum ve aşağıdaki iki satırı
satır 1: sqlalchemy.ext.declarative import declarative_base'den satır 2: Base = declarative_base()
Bu şekilde oluşturdum çünkü farklı dosyalarda birden çok model sınıfı oluşturuyorum. Bunun arkasında belirli bir sebep yok, sadece ben java'da bu şekilde fasulye oluşturdum. Cevap için teşekkürler. – Aniruddha

+0

@Aniruddha Bahşiş için teşekkürler. Ayrıca bu 2 satırı modülün '__init __. Py' dosyasında & mymodule import Base'den –