【已解决】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
以上问题,如果可以回退版本号,推荐回退版本号,这样效率更高。