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