def clear_tables_null(self, table_name, field='价格'): print(table_name,field) #已知可能被注入 query = "delete from %s where %s is null" % (table_name,field) #??? query = "delete from %s where %s is null" self.cursors.execute(query, (table_name,field)) self.conn.commit()这个语句已经是错误的语句,请问我错在哪个格式
时间: 2024-01-01 08:04:13 浏览: 54
这个语句中的第二个参数 `(table_name, field)` 应该是一个元组,用于替换 SQL 语句中的 `%s` 占位符。因此,应该将第二个参数改为 `(field,)`,即使只有一个元素的元组也必须在元素后面加上逗号,否则会被认为是字符串而不是元组。修改后的代码如下:
```python
def clear_tables_null(self, table_name, field='价格'):
print(table_name, field)
# 已知可能被注入
query = "delete from %s where %s is null"
self.cursors.execute(query, (table_name, field,))
self.conn.commit()
```
注意:为了防止 SQL 注入攻击,这个方法最好使用参数化查询,而不是通过字符串拼接构造 SQL 语句。可以将 SQL 语句中的 `%s` 占位符替换为 `?`,然后将参数作为元组传递给 `execute` 方法,例如:
```python
query = "delete from %s where %s is null"
self.cursors.execute(query, (table_name, field,))
```
相关问题
class PlaceholderMap(object): def __init__(self,name,type,field): self.name=name self.type=type self.field=field
这是一个Python类的定义,类名为PlaceholderMap。它有三个属性:name、type、field,分别表示占位符的名称、类型和字段。这个类的初始化函数__init__接受三个参数,分别是name、type和field,用于初始化三个属性。这个类可能被用作机器学习模型中的占位符映射,用于指定输入数据的格式。
import csv class SalesTable: def __init__(self, n, unit, date, ): self.n = n self.unit = unit self.date = date self.sales = [] self.total = 0 def input_sales(self): for i in range(1, self.n + 1): No = input("请输入代号:") Name = input("请输入名字:") Num = input("请输入大小:") Price = int(input("请输入价格:")) self.sales.append(line(No, Name, Num, Price)) self.Price = Price def output_table(self): with open('sales_table.csv', mode='w', newline='') as f: writer = csv.writer(f) writer.writerow(['销售清单']) writer.writerow(['单位:' + self.unit, '日期:' + self.date]) writer.writerow(['No', 'Name', 'Num', 'Price']) for table in self.sales: writer.writerow([table.No, table.Name, table.Num, table.Price]) self.total += table.Price writer.writerow(['总销售额:'+str(self.total)]) print("CSV文件已成功生成!") print("单位:{}\t\t\t\t\t\t日期:{}".format(self.unit, self.date)) print('-' * 50) for table in self.sales: table.torow() print('-' * 50) print('总销售额:{:,.3f}'.format(self.total)) class line: def __init__(self, No, Name, Num, Price): self.No = No self.Name = Name self.Num = Num self.Price = Price def torow(self): print('|{:<10}|{:<10}|{:>10}|{:>15,.3f}'.format(self.No, self.Name, self.Num, self.Price)) n = int(input('成员数量:')) unit = input('单位:') date = input('日期:') sales_table = SalesTable(n, unit, date, ) sales_table.input_sales() sales_table.output_table()请分析这个代码的功能和运用了什么
这段代码是一个简单的销售清单程序,使用了Python内置的csv模块来生成.csv文件,其中SalesTable类包含了销售清单的基本信息和一系列销售清单项,line类则是销售清单项的数据结构。程序首先让用户输入销售清单的基本信息和销售清单项的数量,然后通过input_sales()方法依次获取每个销售清单项的数据,将其存储在一个列表中。最后,程序通过output_table()方法将销售清单的基本信息和每个销售清单项的数据写入.csv文件,并打印在控制台上,同时计算并输出销售总额。程序使用了Python的面向对象编程思想,通过类和对象来组织和处理数据,同时运用了Python内置的csv模块来方便地生成.csv文件。
阅读全文