【问题标题】:How do I handle database columns with reserved characters in SQLAlchemy ORM?如何在 SQLAlchemy ORM 中处理带有保留字符的数据库列?
【发布时间】: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


【解决方案1】:

感谢@DeepSpace 帮我找到答案。

代替

newrow.whatever = instance.whatever

我需要:

setattr(newrow, 'Slot/Port', getattr(instance, 'Slot/Port'))

【讨论】:

    猜你喜欢
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2018-07-31
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多