Python psycopg2:TypeError:在字符串格式化过程中未转换所有参数

Python psycopg2:TypeError:在字符串格式化过程中未转换所有参数,python,database,psycopg2,Python,Database,Psycopg2,我查看了许多堆栈溢出帖子,大多数帖子都告诉我在插入值(%s)时需要使用元组或列表。我尝试了列表和元组,但仍然得到了相同的错误:在字符串格式化过程中,并非所有参数都被转换。以下是用于将某些数据插入PostgreSQL数据库的函数代码: sql = ''' INSERT INTO immediate_info ( bytes_sent, bytes_recv, packets_sent, packets_recv, errin, errout,

我查看了许多堆栈溢出帖子,大多数帖子都告诉我在插入
值(%s)
时需要使用
元组
列表
。我尝试了列表和元组,但仍然得到了相同的错误:
在字符串格式化过程中,并非所有参数都被转换。以下是用于将某些数据插入PostgreSQL数据库的函数代码:

sql = '''
    INSERT INTO immediate_info (
    bytes_sent,
    bytes_recv,
    packets_sent,
    packets_recv,
    errin,
    errout,
    dropin,
    dropout)
    VALUES (%s);
'''

conn = None

bytes_recv, bytes_sent, packets_sent, packets_recv, errin, errout, dropin, dropout = data

try:
    conn = psycopg2.connect('all the connect stuff')
    # create a new cursor
    cur = conn.cursor()
    # execute the INSERT statement
    cur.execute(sql, (bytes_recv, bytes_sent, packets_sent, packets_recv, errin, errout, dropin, dropout,))
    # commit the changes to the database
    conn.commit()
    # close communication with the database
    cur.close()

except (Exception, psycopg2.DatabaseError) as error:

    print(error)

finally:
    if conn is not None:
        conn.close()
如上所述,我也尝试过使用列表。这次我决定先解包
数据
列表,尽管在我看来,使用索引(数据[0]、数据[1]等)简单地查看
数据
列表将得到相同的结果

数据
包含一些用于测量计算机带宽的网络信息。它的所有内容都是
int
格式

另外,如果您注意到,这里的字符串格式是旧的(指
值(%s)
)。在这种情况下如何使用
f
-格式?
如何消除此错误?

使用
游标执行
插入
语句时。执行

  • 插入的列数必须与
    VALUES
    子句中的占位符数匹配
  • cursor.execute的第二个参数中的元素数必须与
    VALUES
    子句中的占位符数匹配
所以

cursor.execute(““”插入到foo(bar,baz,qux)值(%s,%s)”,args)
错误,因为插入了三列,但只有两个值占位符

cursor.execute(““”插入到foo(bar,baz,qux)值(%s,%s,%s)”,
(‘a’、‘b’、‘c’、‘d’)

错误,因为第二个参数中的值数量与
子句中的占位符数量不匹配。

您正在值中传递
持续时间
,但它没有列在
插入
列中。所以应该是8个值,而你要传递9个。对不起,这是问题本身的错误,而不是代码。我只是忘了把它删掉。我希望现在的问题是正确的。问题仍然存在。然后问题将显示实际代码和错误。请注意,使用f字符串(或任何其他类型的字符串格式)向SQL查询中注入值不是一种安全的方法。我现在确实编辑了它。还有,那更好的办法是什么?或者评论不是询问此事的最佳场所?对不起,我昨天一定是睡着了!vlaues子句中的
“%s”
的数量也必须与插入的列的数量相匹配,因此您的代码应该是
。。。值(%s,%s,%s,%s,%s,%s,%s,%s,%s)
,假设插入八列。