2014-02-28 1 views
1

나는 이런 식으로 뭔가를 사용하여 다 대다 테이블과 메신저로 일부 필드를 추가 할 :표는 many-to-many 및 초기화 필드

test_server = FileServer('192.168.1.1', 80, 'online') 
session.add(test_server) 
session.commit() 

test_file = File('test.txt', '123456.txt', hash('123456.txt'), 1024, 1) 
session.add(test_file) 
session.commit() 

# add also initialize there for chunk_size, chunk_number; what also add there? 
test_file.server_id.append(test_server) 
session.commit() 

도 chunk_number를 초기화하고 일부 값을 수 chunk_size. SQLAlchemy에서 그것을 수행하는 방법? m2m을 class로 옮길 수도 있습니다. Base를 사용하고 계십니까?

소스 코드 :

from time import gmtime, strftime 

import sqlamp 
from sqlalchemy import create_engine, MetaData 
from sqlalchemy import Integer, DateTime, Float, BigInteger, Boolean, String, Column, ForeignKey, Table 
from sqlalchemy.orm import validates, relationship, relation 
from sqlalchemy.ext.declarative import declarative_base 

engine = create_engine('postgresql://user:[email protected]/csan') 
metadata = MetaData(engine) 
Base = declarative_base(metadata=metadata, metaclass=sqlamp.DeclarativeMeta) 

m2m_file_server = Table('m2m_file_server', Base.metadata, 
    Column('id', Integer, primary_key=True), 
    Column('file_id', Integer, ForeignKey('file.id')), 
    Column('server_id', Integer, ForeignKey('fileserver.id')), 
    # additional fields 
    Column('chunk_number', Integer, nullable=False) 
    Column('chunk_size', Integer, nullable=False) 
) 


class File(Base): 
    __tablename__ = 'file' 
    id = Column(Integer, primary_key=True) 
    original_name = Column(String, nullable=False) 
    server_name = Column(String, nullable=False) 
    file_hash = Column(String, nullable=False) 
    filesize = Column(BigInteger) 
    catalog_id = Column(Integer, ForeignKey("catalog.id")) 
    server_id = relationship("FileServer", secondary=m2m_file_server) 

    def __init__(self, orig_name, serv_name, file_hash, filesize, catalog_id): 
     self.original_name = orig_name 
     self.server_name = serv_name 
     self.file_hash = file_hash 
     self.filesize = filesize 
     self.catalog_id = catalog_id 

    def __repr__(self): 
     return "<File('%s','%s','%s','%d')>" % (self.original_name, self.server_name, self.file_hash, 
                self.filesize) 


class FileServer(Base): 
    __tablename__ = 'fileserver' 
    id = Column(Integer, primary_key=True) 
    ip = Column(String, nullable=False) 
    port = Column(Integer, nullable=False) 
    status = Column(String) 
    last_online = Column(DateTime) 

    def __init__(self, ip, port, status): 
     self.ip = ip 
     self.port = port 
     self.status = status 
     self.last_online = strftime("%Y-%m-%d %H:%M:%S", gmtime()) 

    def __repr__(self): 
     return "<FileServer('%s','%d','%s','%s')>" % (self.ip, self.port, self.status, self.last_online) 

답변

1

당신은 Association Object을 사용해야합니다.

테이블 idextra_fields과 연결할 새 Association 클래스를 만들어야합니다.