【发布时间】:2016-10-29 15:38:21
【问题描述】:
我对 SQLAlchemy ORM 有点陌生,我正在尝试从列名中包含正斜杠的视图中选择并存储列中的数据。
使用以下方式映射数据库:
source_engine = create_engine("...")
base = automap_base()
base.prepare(source_engine, reflect=True)
metadata = MetaData(self.engine)
table_1 = Table("table_1", self.metadata, autoload=True)
第二个目标表的映射方式相同。
然后,我连接到该数据库,并尝试从列中选择信息以复制到不同的数据库:
source_table_session = Session(source_engine)
dest_table_session = Session(dest_engine)
table_1_data = table_1_session.query(table_1)
for instance in table_1_data:
newrow = dest_table.base.classes.dest_table()
newrow.Column1 = instance.Column1 # This works fine, column has normal name
但是,问题是视图中有一个名为“Slot/Port”的列
通过直接查询,您可以:
select "Slot/Port" from source_database;
但在 ORM 中,你不能只输入:
newrow.Slot/Port = instance.Slot/Port
或
newrow.'Slot/Port' = instance.'Slot/Port'
这不会是正确的,以下也不起作用:
newrow.SlotPort = instance.SlotPort
AttributeError: 'result' 对象没有属性 'SlotPort'
我无法控制源数据库中列的命名方式。
我发现 SQLAlchemy 文档通常是零散的(仅显示小的 sn-ps 代码)并且令人困惑,所以我不确定这是否已经解决。有没有办法绕过这个限制,或者如果列已经映射到没有斜杠的有效名称或这样做的方法?
【问题讨论】:
-
如果我没记错的话,
instance['Slot/Port']应该可以工作。 -
@DeepSpace 嗯……不完全是,我得到了
TypeError: tuple indices must be integers, not str。我也试过双引号。 -
然后试试
getattr(instance, 'Slot/Port')。如果这仍然不起作用,请尝试打印dir(instance)并查找相关属性,它可能已被重命名为使用有效字符。 -
太棒了,@DeepSpace。更多的内置函数研究让我到达了我需要的地方:
setattr(newrow, 'Slot/Port', getattr(instance, 'Slot/Port')) -
也可以使用反射事件来改变赋予列的键:stackoverflow.com/questions/19215759/…
标签: python database python-2.7 orm sqlalchemy