Skip to main content
 首页 » 编程设计

python之sqlalchemy 的 xml 配置

2025年05月04日15zhwl

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

  1. 我应该使用经典的映射器,即 mapper() 函数吗?
  2. 经典映射是否像声明性映射一样给出所有选项?
  3. 有没有类似hibernate hbm.xml文件的xml配置方式?

问候, 小

请您参考如下方法:

这里是一个示例,说明如何为基于 xml 的 orm 类手工制作您自己的解决方案。它从 this tutorial 中读取 User.hbm.xml 文件.这是一个 hack - 我对 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()