首页 > 解决方案 > 使用字符串变量时动态创建表名和列名时的 SQLalchemy 属性错误

问题描述

我遇到了一个问题,我需要创建一个新表和一个特定的列,因为我需要从常规数据表到映射表中执行 SELECT INTO。由于我在数据库中使用的数据的性质,表名和两列名是动态的。

我尝试使用SQLAlchemy 中的 Use variable column headings 中的示例,但仍然出现错误。这是基本代码:

                RecIndex = # some string key value that changes
                tableData = "Data-" + str(i)
                tableName = f'Mapping{idx}'
                colName = f'Voltage{i}-V{idx}'

                col_list = ['Reading', 'Date', colName]
                t_list = {TableData: [RecIndex, colName], tableName: [RecIndex, colName]}
                table_list = []

                for t_name, col_name in t_list.items():
                    t = Table(
                        t_name, metadata,
                        Column('Reading', Integer),
                        Column('Date', Date),
                        *[Column(name, Integer) for name in col_name]
                    )

                    table_list.append(t)

                t1 = table_list[0]      # Mapping table
                t2 = table_list[1]      # Data table

                sel = t1.insert().from_select(col_list, t2.select().where(t2.c.colName > 0))  # FAILS HERE

但是,当我尝试构建 sel 变量时,它会失败并且我收到以下错误消息:

回溯(最后一次调用):文件“C:\Python\Python\lib\site-packages\sqlalchemy\sql\base.py”,第 1201 行,在getattr return self._index[key]

键错误:'colName'

sel = t1.insert().from_select(col_list, t2.select().where(t2.c.colName > 0))

文件“C:\Python\Python\lib\site-packages\sqlalchemy\sql\base.py”,第 1203 行,在getattr util.raise_(​​AttributeError(key), replace_context=err)

文件“C:\Python\Python\lib\site-packages\sqlalchemy\util\compat.py”,第 207 行,在 raise_raise 异常中

属性错误:colName

任何人都知道为什么它不起作用?我将不胜感激任何帮助

标签: pythonsqlalchemy

解决方案


在您的示例代码中,您通过变量的名称引用列,colName而不是变量的内容,即。"Voltage0-V2". 尝试这样的事情:

sel = t1.insert().from_select(col_list, t2.select().where(getattr(t2.c, colName) > 0))

这只是内置的 getattr: getattr

我认为dict样式查找也受支持,即。t2.c[colName],所以这也可能有效:

sel = t1.insert().from_select(col_list, t2.select().where(t2.c[colName] > 0))

推荐阅读