【已解决】Python读取sql数据,报错:Not an executable object,解决方案

【已解决】Python读取sql数据,报错:Not an executable object,解决方案

1.报错内容:

通过Python连接sql,读取sql中数据,报错:Not an executable object。具体代码及报错内容见下:

def employee():
    employee_id = []
    try:
        engine = sql_cn.connect_sql_ob_10200("prod")
        
        with engine.connect() as conn:
            # 获取实验组专家
            sql = '''SELECT employee_account_id FROM employee_group where employee_group ='B' '''
            result = conn.execute(sql)
            for row in result:
                employee_id.append(row[0])
    except Exception as e:
        logger.error(f"获取专家ID出现问题:{e}")
        
    logger.info(f"专家获取完成, 共:{len(employee_id)}")
    return employee_id

报错内容:
在这里插入图片描述

Not an executable object: "SELECT employee_account_id FROM employee_group where employee_group ='B' "

2.报错原因:

  • 当前执行语句不是一个可执行对象,主要是由于sqlalchemy版本不同造成的。sqlalchemy中1.4和2.0两种不同的语法。(如果版本可以回退,直接回退就可以解决)

3.解决方案:

方案一:回退版本。

  • sqlalchemy的1.4和2.0两种不同的语法,pandas暂时还不支持2.0,所以将sqlalchemy回退到1.4.45即可。
pip3 uninstall SQLAlchemy

pip3 install SQLAlchemy==1.4.45

方案二:如果不可以回退,通过导入其他包解决:

# 新增位置一:
from sqlalchemy import text

def employee():
    employee_id = []
    try:
        engine = sql_cn.connect_sql_ob_10200("prod")
        
        with engine.connect() as conn:
            # 获取实验组专家
            sql = '''SELECT employee_account_id FROM employee_group where employee_group ='B' '''
            # 修改位置二:
            result = conn.execute(text(sql))
            for row in result:
                employee_id.append(row[0])
    except Exception as e:
        logger.error(f"获取专家ID出现问题:{e}")
        
    logger.info(f"专家获取完成, 共:{len(employee_id)}")
    return employee_id

附:pd.read_sql_query() 报错:‘OptionEngine’ object has no attribute ‘execute’ 解决方案

  • 该问题和前面基本原因是一样的,只要修改连接方式,则可解决:

报错代码:

def get_index_data():
    engine = sql_cn.connect_sql_ob_10200("prod")
    sql = "select * from da_defeat_act.label_customer_index"

    index_data = pd.read_sql_query(sql, engine)
    
    return index_data

报错内容:
在这里插入图片描述

修改后代码:

def get_index_data():
    engine = sql_cn.connect_sql_ob_10200("prod")
    # 新增位置一
    connection = engine.connect()
    sql = "select * from da_defeat_act.label_customer_index"
		
		# 修改位置二:
    index_data = pd.read_sql_query(text(sql), connection)
    
    return index_data

以上问题,如果可以回退版本号,推荐回退版本号,这样效率更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文言AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值