使用SQLAlchemy连接PostgreSQL执行查询时遇TypeError问题求助
解决SQLAlchemy 2.0与pandas 1.1.5搭配时的
TypeError: MetaData.__init__() got multiple values for argument 'schema'错误 问题原因
你遇到的错误核心是版本兼容性问题:你的pandas版本是1.1.5,该版本的pd.read_sql方法尚未适配SQLAlchemy 2.0的API规范,而你使用的SQLAlchemy是2.0.1,两者在参数传递逻辑上不匹配,导致调用MetaData.__init__时出现重复传参的错误。
关于你提到的PostgreSQL驱动问题:你已经安装了psycopg2,这是SQLAlchemy连接PostgreSQL所需的驱动,SQLAlchemy会自动识别并使用它,不需要额外导入驱动模块,所以驱动不是触发该错误的原因。
解决方案
以下是三种可行的解决方式,按需选择:
1. 降级SQLAlchemy到1.x稳定版
这是最省心的方案,不需要修改现有代码,直接让SQLAlchemy版本适配pandas 1.1.5:
pip install sqlalchemy==1.4.46
(1.4.x是SQLAlchemy 1.x的最后一个大版本,稳定性和兼容性都很好)
2. 升级pandas到支持SQLAlchemy 2.0的版本
pandas从1.5.0版本开始正式支持SQLAlchemy 2.0,你可以升级到兼容Python3.7的版本:
pip install pandas==1.5.3
(Python3.7最高支持pandas 1.5.x,更高版本的pandas不再兼容3.7)
3. 修改代码适配SQLAlchemy 2.0(不修改版本的情况下)
调整sql_to_frame方法的实现,避免直接传递Connection对象给pd.read_sql,改用Engine对象:
def sql_to_frame(self, filename): with open(filename, 'r') as file: query = file.read() # 改用connection关联的engine对象 dataframe = pd.read_sql(text(query), self.connection.engine) return dataframe
或者在Connection类中直接保存Engine实例,后续操作基于Engine:
class Connection: def __init__(self): load_dotenv() self.engine = sqlalchemy.create_engine(os.getenv('CONNECTION_STRING')) try: # 保留连接测试,但后续操作使用engine with self.engine.connect() as conn: print("Connected to server : SUCCESS") except SQLAlchemyError as error: raise f'[CONNECTION ERROR] {error}' def sql_to_frame(self, filename): with open(filename, 'r') as file: query = file.read() dataframe = pd.read_sql(text(query), self.engine) return dataframe def close(self): # Engine不需要手动关闭,连接会自动管理 pass
内容的提问来源于stack exchange,提问作者abhinit21
相关产品推荐
相关产品推荐

