Python sqlalchemy的xml配置

Python sqlalchemy的xml配置,python,sqlalchemy,Python,Sqlalchemy,有没有办法从模型类中删除python sqlalchemy映射?到目前为止,我一直在使用声明性映射,其中类将扩展声明性基。但现在我想在生成的python模块中映射一些模型。所以我不能修改模型类 我应该使用经典的mapper,即mapper()函数吗 经典映射是否提供了声明性映射的所有选项 有没有像hibernate hbm.xml文件那样的xml配置方式 问候,, Litty这里是一个如何为基于xml的orm类手工制作自己的解决方案的示例。它从中读取User.hbm.xml文件。这是一个黑客-我

有没有办法从模型类中删除python sqlalchemy映射?到目前为止,我一直在使用声明性映射,其中类将扩展声明性基。但现在我想在生成的python模块中映射一些模型。所以我不能修改模型类

  • 我应该使用经典的mapper,即mapper()函数吗
  • 经典映射是否提供了声明性映射的所有选项
  • 有没有像hibernate hbm.xml文件那样的xml配置方式
  • 问候,,
    Litty

    这里是一个如何为基于xml的orm类手工制作自己的解决方案的示例。它从中读取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()          
    

    这里是一个如何手工为基于xml的orm类设计自己的解决方案的示例。它从中读取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()          
    

    答案是“是”、“是”和“否”。也许你应该要求更多的细节或例子,或者一些对解决你的问题更有帮助的东西。SQLAlchemy文档的哪一部分令人困惑?这是我最初调查时的一个问题。只是想从专家那里确认一下。我的意图是使用基于xml的映射(如果有的话);否则,请确保使用声明式可以实现的任何功能也可以使用古典式。感谢您的回答。请查看
    构造函数的
    自动加载
    参数。这在某种程度上相当于Hibernate的内省功能,只是它是在运行时而不是构建时完成的。这可能对你有帮助。@LItty:你真的应该更新问题,解释你真正想知道的。“是的”、“是的”、“不是”之类的小事是不可能的。SQLAlchemy文档在某种程度上令人困惑吗?有没有不清楚的地方?你能更新这个问题来解释SQLAlchemy文档中让你困惑的部分吗?答案是“是”、“是”和“否”。也许你应该要求更多的细节或例子,或者一些对解决你的问题更有帮助的东西。SQLAlchemy文档的哪一部分令人困惑?这是我最初调查时的一个问题。只是想从专家那里确认一下。我的意图是使用基于xml的映射(如果有的话);否则,请确保使用声明式可以实现的任何功能也可以使用古典式。感谢您的回答。请查看
    构造函数的
    自动加载
    参数。这在某种程度上相当于Hibernate的内省功能,只是它是在运行时而不是构建时完成的。这可能对你有帮助。@LItty:你真的应该更新问题,解释你真正想知道的。“是的”、“是的”、“不是”之类的小事是不可能的。SQLAlchemy文档在某种程度上令人困惑吗?有没有不清楚的地方?您可以更新这个问题来解释SQLAlchemy文档中让您困惑的部分吗?