我遇到了一个问题,我需要创建一个新表和一个特定的列,因为我需要从一个常规的数据表到一个映射表做SELECT INTO。由于我在数据库中处理的数据的性质,表名和两个列名是动态的。
我尝试使用在SQLAlchemy中使用变量列标题的例子,但我仍然得到错误被提出。下面是基本代码:
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变量时,它失败了,我得到这个错误消息:
Traceback(最近一次调用):文件"C:PythonPythonlibsite-packagessqlalchemysqlbase.py",第1201行,在getattr返回self._index(例子)
KeyError:"colName">
sel = t1.insert().from_select(col_list, t2.select().where(t2.c.)colName祝辞
0))
File "C:PythonPythonlibsite-packagessqlalchemysqlbase.py",第1203行,在getattrutil.raise_ (AttributeError(关键),replace_context =犯错)
File "C:PythonPythonlibsite-packagessqlalchemyutil pat.py",第207行,在raise_提高异常
AttributeError: colName
有人知道为什么它不工作吗?我将非常感谢任何帮助
在您的示例代码中,您通过变量的名称引用列,colName
而不是变量的内容,即。"Voltage0-V2"
。试试这样做:
sel = t1.insert().from_select(col_list, t2.select().where(getattr(t2.c, colName) > 0))
这只是内置的getattr:getattr
我认为dict
风格的查找也支持ie。t2.c[colName]
,所以这也可能工作:
sel = t1.insert().from_select(col_list, t2.select().where(t2.c[colName] > 0))