2013-03-02 19 views
17

Tôi đang học sqlalchemy. Đây là mã ban đầu của tôi:SQLAlchemy - declarative_base

File: 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 

file main.py

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

Bây giờ khi tôi chạy main.py. Nó sẽ không tạo bảng tự động & cho tôi ngoại lệ trên 'session.commit()'. Bây giờ khi tôi di chuyển dòng 'Base = declarative_base()' sang mô-đun khác nhau & sử dụng biến 'Cơ sở' giống nhau trong main.py & user.py. Nó tạo ra bảng.

Câu hỏi của tôi là 'declarative_base' là gì?

+0

Lỗi bạn nhận được khi thực hiện theo cách khác là gì? –

Trả lời

19

declarative_base() là một chức năng của nhà máy xây dựng một lớp cơ sở cho các định nghĩa lớp khai báo (được gán cho biến Base trong ví dụ của bạn). Cái bạn đã tạo trong user.py được liên kết với mô hình User, trong khi cái kia (trong main.py) là một lớp khác và không biết gì về mô hình của bạn, đó là lý do tại sao cuộc gọi Base.metadata.create_all() không tạo bảng. Bạn cần phải nhập khẩu Base từ user.py

from user import User, Base 

thay vì tạo một Base lớp mới trong main.py.

+1

Tôi đã tạo tệp mới và đặt sau hai dòng
dòng 1: từ sqlalchemy.ext.declarative import declarationative_base dòng 2: Base = declarative_base()
Tôi tạo theo cách đó bởi vì tôi đang tạo nhiều lớp mô hình trong các tệp khác nhau. Không có lý do cụ thể đằng sau đó, Nó chỉ là tôi đã sử dụng tạo ra đậu theo cách đó trong java. Cảm ơn về câu trả lời. – Aniruddha

+0

@Aniruddha Cảm ơn lời khuyên. Tôi cũng đặt 2 dòng đó trong tập tin '__init __. Py' của module và' từ mymodule Import Base' –

Các vấn đề liên quan