【问题标题】:xml configuration for sqlalchemysqlalchemy 的 xml 配置
【发布时间】:2012-02-08 13:34:36
【问题描述】:

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

  1. 我应该使用作为 mapper() 函数的经典映射器吗?
  2. 经典映射是否提供所有选项作为声明性映射?
  3. 有没有类似hibernate hbm.xml文件的xml配置方式?

问候, 小

【问题讨论】:

  • 答案是“是”、“是”和“否”。也许您应该要求提供更多详细信息或示例,或者对解决您的问题更有帮助的东西。 SQLAlchemy 文档的哪一部分令人困惑?
  • 这是我初步调查时的一个问题。只是想从专家那里确认这些。我的意图是使用基于 xml 的映射(如果有的话);否则,请确保声明式的一切可能也适用于古典式。感谢您的回答。
  • 查看autoload 构造函数的Table 参数。这有点等同于 Hibernate 的自省功能,只是它是在运行时而不是构建时完成的。它可能会帮助你。
  • @LItty:您确实应该更新问题以解释您真正想知道的内容。不能是微不足道的“是”、“是”、“否”之类的事情。 SQLAlchemy 文档在某种程度上是否令人困惑?有没有不清楚的部分?您能否更新问题以解释 SQLAlchemy 文档的哪一部分让您感到困惑?

标签: python sqlalchemy


【解决方案1】:

这里是一个示例,如何为基于 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()          

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2018-05-19
    相关资源
    最近更新 更多