python - 使用字符串变量时动态创建表名和列名时的 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
任何人都知道为什么它不起作用?我将不胜感激任何帮助
解决方案
在您的示例代码中,您通过变量的名称引用列,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))
推荐阅读
- javascript - 为什么我会丢失使用扩展运算符输入的参数?
- python - 在 groupby 函数后添加一列
- redis - 芹菜:让工人每秒执行x个任务
- django - 表格不在数据库中保存数据
- php - How To Insert CurrentDate into Table
- python - 如何只保留字符串的字母数字字符?
- python - 如何为 Python Dedupe 使用预先标记的训练数据
- excel - 如果表头有特定的单词,需要复制数据
- java - 如何在testNG中将动态参数传递给dataProvider方法
- javascript - pdfviewer 没有转到正确的 pdf 文件