конфигурация xml для sqlalchemy - PullRequest
       3

конфигурация xml для sqlalchemy

2 голосов
/ 08 февраля 2012

Есть ли способ извлечь сопоставления sqlalchemy для Python из классов моделей? До сих пор я использовал декларативное отображение, где класс будет расширять декларативную базу. Но теперь я хочу отобразить некоторые модели в сгенерированном модуле Python. Поэтому я не могу изменить классы моделей.

  1. Должен ли я использовать классический mapper, который является функцией mapper ()?
  2. Дает ли классическое отображение все параметры в качестве декларативного отображения?
  3. Есть ли способ настройки XML, такой как файлы hibernate hbm.xml?

С уважением, LITTY

1 Ответ

0 голосов
/ 11 сентября 2013

Вот пример того, как создать собственное решение для класса orm на основе xml.Он читает файл User.hbm.xml из этого руководства .Это хак - я ничего не знаю о Hibernate.Надеюсь, что это подходит вам или, может быть, кто-то еще понимает ваш вопрос.

#!/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()          
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...