2012-02-08 2 views
2

모델 클래스에서 python sqlalchemy 매핑을 제거하는 방법이 있습니까? 지금까지 클래스가 선언적 기반을 확장 할 선언 매핑을 사용했습니다. 하지만 이제는 생성 된 파이썬 모듈에서 일부 모델을 매핑하려고합니다. 그래서 모델 클래스를 수정할 수 없습니다.sqlalchemy의 xml 구성

  1. mapper() 함수 인 클래식 매퍼를 사용해야합니까?
  2. 클래식 매핑이 모든 옵션을 선언 매핑으로 제공합니까?
  3. hibernate hbm.xml 파일과 같은 xml 구성 방법이 있습니까?

안부, 손으로 기술하는 방법을 Litty 여기

+2

대답은 "예", "예"및 "아니오"입니다. 아마도 당신은 당신의 문제를 해결하는 데 더 도움이되는 몇 가지 세부 사항이나 예를 들어보아야 할 것입니다. SQLAlchemy 문서의 어떤 부분이 혼란 스럽습니까? –

+0

이것은 처음 조사하는 동안 질문입니다. 전문가들로부터 이것들을 확인하고 싶었습니다. 내 의도는 사용할 수있는 경우 xml 기반 매핑을 사용하는 것이 었습니다. 그렇지 않으면 선언적으로 가능한 것이 무엇이든간에 고전적으로도 가능하다는 것을 확인하십시오. 답을 고맙습니다. – Litty

+0

'Table' 생성자에 대한'autoload' 인자를 확인하십시오. 이는 Hibernate의 인트로 스펙 션 (inrospection) 기능과 같은 종류이다. 단, 빌드 타임 대신 런타임에 완료된다는 점이 다르다. 그것은 당신을 도울 수 있습니다. – wberry

답변

0

샘플 XML 기반 ORM 클래스에 대한 자신의 솔루션을 제공합니다. this tutorial에서 User.hbm.xml 파일을 읽습니다. 이것은 해킹입니다 - 나는 Hibernate에 대해 아무것도 모릅니다. 희망이 당신 또는 어쩌면 누군가가 귀하의 질문에 대한 이해를 elses.

#!/usr/bin/env python3                         
# -*- coding: utf-8 -*-                         

import sqlalchemy as sqAl 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker 
import xml.etree.ElementTree as ET 

def generate_class(class_el):                       

    type_map = {'java.lang.String': sqAl.String,                  
       'java.util.Date': sqAl.Date,                   
       'java.lang.Double': sqAl.Float,                   
       'java.lang.Long': sqAl.Integer}                   

    dynclass_dict = {                         
     'id': sqAl.Column(sqAl.Integer, primary_key=True),                
     '__tablename__': class_el.attrib['table']                  
     }                            
    for field_el in class_el.findall('property'):                  
     field = field_el.attrib                       
     if field['type'] in type_map:                     
      dynclass_dict[field['name']] = sqAl.Column(field['column'], type_map[field['type']])      

    return type(class_el.attrib['table'].capitalize(), (declarative_base(sqAl.MetaData()),), dynclass_dict)    

classe = ET.parse('User.hbm.xml').getroot().find('class') 
User = generate_class(classe) 


if __name__ == '__main__': 
    # the two following lines create the table (if not already existing)                        
    engine = sqAl.create_engine('sqlite:///data.db', echo=True)               
    User.__base__.metadata.create_all(engine, checkfirst=True)               

    session = sessionmaker(bind=engine)()                    
    u = User(userFirstName="John F.", userLastName="Kennicknich", userName="jfk")          
    session.add(u)                          
    session.commit()