搭建py2项目时遇到的sqlalchemy.exc.ArgumentError: columns argument to select() must be a Python list or other

文章讲述了在使用Python2.7的老项目中,尝试初始化DB2数据库时遇到的SQLAlchemy版本问题,具体表现为ArgumentError。解决方案是将SQLAlchemy升级至1.4.11版本。
部署运行你感兴趣的模型镜像

项目是一个python2.7.5的老项目,pip list如下:

Package          Version            
---------------- -------------------
certifi          2020.6.20          
click            6.2                
Flask            0.10.1             
Flask-Cors       2.1.2              
Flask-SocketIO   0.6.0              
gevent           1.0.2              
gevent-socketio  0.3.6              
gevent-websocket 0.9.5              
greenlet         0.4.9              
ibm-db           2.0.6              
ibm-db-sa        0.4.0              
importlib        1.0.3              
itsdangerous     0.24               
Jinja2           2.8                
MarkupSafe       0.23               
nose             1.3.7              
Pillow           3.1.0              
pip              19.3.1             
psycopg2         2.6.1              
reportlab        3.2.0              
setuptools       44.0.0.post20200106
six              1.10.0             
SQLAlchemy       1.3.0              
Werkzeug         0.10.4             
wheel            0.24.0             
xlrd             0.9.4              
xlutils          1.7.1              
xlwt             1.0.0              

运行sqlalchemy进行初始化db2数据库时出现以下问题

Traceback (most recent call last):
  File "init_db.py", line 19, in <module>
    NXBase.metadata.drop_all(engine, checkfirst=True)
  File "/home/liuchuang/miniconda3/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/schema.py", line 4313, in drop_all
    ddl.SchemaDropper, self, checkfirst=checkfirst, tables=tables
  File "/home/liuchuang/miniconda3/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 2033, in _run_visitor
    conn._run_visitor(visitorcallable, element, **kwargs)
  File "/home/liuchuang/miniconda3/envs/py2/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1607, in _run_visitor
    visitorcallable(self.dialect, self, **kwargs).traverse_single(element)
  File "/home/liuchuang/miniconda3/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/visitors.py", line 131, in traverse_single
    return meth(obj, **kw)
  File "/home/liuchuang/miniconda3/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", line 883, in visit_metadata
    unsorted_tables = [t for t in tables if self._can_drop_table(t)]
  File "/home/liuchuang/miniconda3/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/ddl.py", line 972, in _can_drop_table
    self.connection, table.name, schema=effective_schema
  File "/home/liuchuang/miniconda3/envs/py2/lib/python2.7/site-packages/ibm_db_sa/base.py", line 770, in has_table
    return self._reflector.has_table(connection, table_name, schema=schema, **kw)
  File "/home/liuchuang/miniconda3/envs/py2/lib/python2.7/site-packages/ibm_db_sa/reflection.py", line 189, in has_table
    s = sql.select(self.sys_tables.c.tabname).where(whereclause)
  File "<string>", line 2, in select
  File "<string>", line 2, in __init__
  File "/home/liuchuang/miniconda3/envs/py2/lib/python2.7/site-packages/sqlalchemy/util/deprecations.py", line 130, in warned
    return fn(*args, **kwargs)
  File "/home/liuchuang/miniconda3/envs/py2/lib/python2.7/site-packages/sqlalchemy/sql/selectable.py", line 2923, in __init__
    "columns argument to select() must "
sqlalchemy.exc.ArgumentError: columns argument to select() must be a Python list or other iterable

解决方案:

升级sqlalchemy版本到1.4.11。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 关于SQLAlchemy中`_list_check_item`函数抛出`ArgumentError`问题的分析 在使用SQLAlchemy,如果遇到`_list_check_item`函数抛出`ArgumentError`错误,并提示`List argument must consist only of tuples or dictionaries`,这通常意味着传递给SQLAlchemy的某个列表参数不符合其内部验证规则。具体来说,SQLAlchemy期望该列表仅包含元组或字典类型的元素[^4]。 #### 错误原因分析 SQLAlchemy的某些功能(例如批量插入操作)需要确保传入的数据结构符合特定格式。对于列表类型的参数,SQLAlchemy会调用内部的`_list_check_item`函数来验证每个元素是否为元组或字典。如果列表中包含其他类型的元素(如整数、字符串等),就会触发`ArgumentError`异常[^4]。 以下是可能导致此问题的一些常见场景: 1. **数据格式不匹配**:传入的列表中包含非元组或非字典类型的元素。 2. **数据缺失**:某些元素为空值或未正确初始化。 3. **数据类型转换错误**:在处理复杂数据结构,未能将数据正确转换为SQLAlchemy所需的格式。 #### 解决方案 为了修复此问题,可以采取以下措施: 1. **检查数据格式** 确保传递给SQLAlchemy的列表中的每个元素都是元组或字典。例如,假设需要插入一批用户数据,正确的数据格式应如下所示: ```python users = [ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 30} ] ``` 或者使用元组形式: ```python users = [ ("Alice", 25), ("Bob", 30) ] ``` 2. **数据预处理** 在将数据传递给SQLAlchemy之前,可以通过代码对数据进行预处理,确保所有元素符合要求。例如: ```python def validate_data(data): for item in data: if not isinstance(item, (tuple, dict)): raise ValueError("List items must be tuples or dictionaries") return data users = [{"name": "Alice", "age": 25}, "invalid_entry", {"name": "Bob", "age": 30}] validated_users = validate_data(users) # 此处会抛出ValueError ``` 3. **调试与日志记录** 如果无法确定问题的具体来源,可以通过打印日志或使用调试工具检查传入的数据。例如: ```python print([type(item) for item in users]) ``` 4. **参考官方文档** 查阅SQLAlchemy的官方文档,了解相关API的具体要求和示例[^4]。 #### 示例代码 以下是一个完整的示例,展示如何正确插入数据并避免`ArgumentError`: ```python from sqlalchemy import create_engine, Table, MetaData, Column, String, Integer # 创建数据库连接 engine = create_engine('sqlite:///:memory:') metadata = MetaData() # 定义表结构 users_table = Table( 'users', metadata, Column('name', String), Column('age', Integer) ) metadata.create_all(engine) # 插入数据 with engine.connect() as connection: users_data = [ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 30} ] # 验证数据格式 for item in users_data: if not isinstance(item, dict): raise ValueError("Each item in the list must be a dictionary") # 执行插入操作 result = connection.execute(users_table.insert(), users_data) print(f"{result.rowcount} rows inserted.") ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值