1.
TypeError:not all arguments converted during string formatting
这个问题一般和格式化有关系,正确的格式应该是:
‘delete from %s %s’ % (table_name, where_condition)
其中格式化中接受元组或者list形式内容,因此也可以是
‘delete from %s %s’ % [table_name, where_condition]
当我的sql语句是要传入pandas的read_sql_query中时,我发现怎么改这个格式化都不起效果后,我查看了read_sql_query中的所有可以使用参数,其中有params选项,即将%s中的数据以params传入的方式实现,此时验证报错问题也得到了解决:
pd.io.sql.read_sql_query(sql, con=engine, params=[...])
2.当我的sql语句中表名需要以参数的形式传入的时候,发现并不可行。通过百度查到的许多都是采用动态表名,但也发现发现MYSQL不支持直接使用变量做表名。在python中通过两个方法解决此问题:
(1)pandas中有pd.io.sql.read_sql_table(table_name, con=engine),它可以通过你的给的表名参数读取将该表数据形成dataframe的形式返回。
(2)可以设置方法拼装字符串通过将参数拼装成一个sql语句,参考链接:https://www.cnblogs.com/guohaojintian/p/5994472.html
def remove_data(table_name, where_condition):
if (where_condition != ' '):
str = 'where '
for key_value in where_condition.keys():
value = where_condition[key_value]
str = str + '`' + key_value + '`' + ' = ' + '\'' + value + '\'' + ' and '
where_condition = str[:-5]
table_name = '`'+table_name+'`'
sql = 'delete from %s %s' % (table_name, where_condition)
# print(sql)
return sql
在应用中再进行:
try:
pd.io.sql.read_sql_query(sql, con=engine)
except:
print('deleted ')
这里之所以运用了try-catch 接受,是因为read_sql可以接受SQL语句,包括增删改查。但是DELETE语句不会返回值(但是会在数据库中执行),UPDATE,SELECT等会返回结果.删除插入更新操作没有返回值,程序会抛出:ResourceClosedError at …This result object does not return rows.,终止程序。如果想继续运行,可以try捕捉此异常。
参考链接:https://www.cnblogs.com/cymwill/p/8289367.html
3.这是一个关于mysql规范的问题。
(1)mysql不建议表名纯数字,因此sql中表名直接是数字的话需要带有`符号,也就是1键的前一个键,同样字段不建议有带‘-’,但是如果需求上需要的话也可以带`即可
delete from `201501` where `zon-order-id` = '113-2826971'