python错误:InterfaceError:绑定参数0时出错 - 可能是不支持的类型

时间:2014-12-23 18:34:42

标签: python python-2.7 sqlite

我正在处理我的python脚本,因为我正在尝试将一个id和值列表存储到sqlite3数据库中。我的代码有问题。

当我尝试这个时:

#create the buttons in the database
cur.execute('CREATE TABLE IF NOT EXISTS buttons(button_ids TEXT, button_width TEXT)')
programs_button = [elem.control for elem in self.program_buttons]
program_id = list()
program_width = list()

#generating the program button ids
for generate_ids in range(3002, 3485):
    program_id.append(generate_ids)
print program_id

for elem in programs_button:
    program_width.append(elem.getWidth())
print program_width
#store the buttons in the database
cur.execute("INSERT INTO buttons(button_ids, button_width)" + " VALUES(?, ?)", [program_id, program_width])

它给我错误:

18:12:24 T:5328   ERROR: Exception in thread All_Channels_BACKUP_thread:
Traceback (most recent call last):
File "C:\Program Files (x86)\XBMC\system\python\Lib\threading.py", line 532, in __bootstrap_inner
self.run()
File "C:\Users\user\AppData\Roaming\XBMC\addons\script.tvguide\test.py", line 7661, in run
self.xtarget()
File "C:\Users\user\AppData\Roaming\XBMC\addons\script.tvguide\test.py", line 1185, in All_Channels_BACKUP
cur.execute("INSERT INTO buttons(button_ids, button_width)" + " VALUES(?, ?)", [program_id, program_width])
InterfaceError: Error binding parameter 0 - probably unsupported type.

错误是跳到这一行:

cur.execute("INSERT INTO buttons(button_ids, button_width)" + " VALUES(?, ?)", [program_id, program_width])

以下是program_id数据列表:

16:44:50 T:1296  NOTICE: [3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010, 3011, 
3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 
3027, 3028, 3029, 3030, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, 3041, 
3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056, 
3057, 3058, 3059, 3060, 3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, 3069, 3070, 3071, 
3072, 3073, 3074, 3075, 3076, 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, 
3087, 3088, 3089, 3090, 3091, 3092, 3093, 3094, 3095, 3096, 3097, 3098, 3099, 3100, 3101, 
3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 
3117, 3118, 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, 3128, 3129, 3130, 3131, 
3132, 3133, 3134, 3135, 3136, 3137, 3138, 3139, 3140, 3141, 3142, 3143, 3144, 3145, 3146, 
3147, 3148, 3149, 3150, 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, 3159, 3160, 3161, 
3162, 3163, 3164, 3165, 3166, 3167, 3168, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, 
3177, 3178, 3179, 3180, 3181, 3182, 3183, 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, 
3192, 3193, 3194, 3195, 3196, 3197, 3198, 3199, 3200, 3201, 3202, 3203, 3204, 3205, 3206, 
3207, 3208, 3209, 3210, 3211, 3212, 3213, 3214, 3215, 3216, 3217, 3218, 3219, 3220, 3221, 
3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, 3231, 3232, 3233, 3234, 3235, 3236, 
3237, 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, 3246, 3247, 3248, 3249, 3250, 3251, 
3252, 3253, 3254, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3262, 3263, 3264, 3265, 3266, 
3267, 3268, 3269, 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277, 3278, 3279, 3280, 3281, 
3282, 3283, 3284, 3285, 3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, 
3297, 3298, 3299, 3300, 3301, 3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309, 3310, 3311, 
3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325, 3326, 
3327, 3328, 3329, 3330, 3331, 3332, 3333, 3334, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 
3342, 3343, 3344, 3345, 3346, 3347, 3348, 3349, 3350, 3351, 3352, 3353, 3354, 3355, 3356, 
3357, 3358, 3359, 3360, 3361, 3362, 3363, 3364, 3365, 3366, 3367, 3368, 3369, 3370, 3371, 
3372, 3373, 3374, 3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, 3383, 3384, 3385, 3386, 
3387, 3388, 3389, 3390, 3391, 3392, 3393, 3394, 3395, 3396, 3397, 3398, 3399, 3400, 3401, 
3402, 3403, 3404, 3405, 3406, 3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414, 3415, 3416, 
3417, 3418, 3419, 3420, 3421, 3422, 3423, 3424, 3425, 3426, 3427, 3428, 3429, 3430, 3431, 
3432, 3433, 3434, 3435, 3436, 3437, 3438, 3439, 3440, 3441, 3442, 3443, 3444, 3445, 3446, 
3447, 3448, 3449, 3450, 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, 
3462, 3463, 3464, 3465, 3466, 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474, 3475, 3476, 
3477, 3478, 3479, 3480, 3481, 3482, 3483, 3484]

以下是program_width数据列表:

01:35:37 T:340  NOTICE: [342, 879, 879, 342, 342, 342, 342, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 342, 879, 342, 342, 342, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 879, 342, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 879, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 879, 342, 342, 879, 342, 691, 342, 342, 879, 342, 342, 342, 342, 342, 
879, 879, 342, 342, 342, 342, 342, 342, 879, 342, 879, 342, 342, 691, 342, 342, 879, 342, 
342, 342, 342, 342, 879, 879, 342, 342, 342, 342, 342, 342, 879, 342, 342, 342, 342, 342, 
342, 342, 342, 691, 342, 342, 879, 342, 342, 342, 342, 342, 879, 879, 342, 342, 342, 342, 
691, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 879, 879, 342, 342, 342, 
879, 342, 691, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 879, 879, 342, 
342, 342, 879, 342, 691, 342, 342, 342, 879, 879, 342, 342, 342, 342, 342, 879, 879, 342, 
342, 342, 879, 342, 691, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 
342, 342, 879, 342, 342, 342, 342, 879, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 879, 342, 691, 342, 342, 342, 879, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 879, 879, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 879, 879, 342, 342, 342, 342, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 879, 879, 342, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 879, 879, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 691, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 691, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 691, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 879, 342, 342, 342, 342, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 
342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 879, 342, 342, 342, 342, 342, 342, 
342, 342, 342]

以下是完整代码:

 # set the channels text
 for index in range(0, CHANNELS_PER_PAGE):
     #get the programs list
     cur = con.cursor()
     cur.execute('SELECT channel, title, start_date, stop_date FROM programs WHERE channel=?', [channel])
     programs = cur.fetchall()


     for ind, row in enumerate(programs):
         program = row[1].encode('ascii'), str(row[2]), str(row[3])
         title = row[1].encode('ascii')
         program_start_date = str(row[2])
         program_end_date = str(row[3])

         #create width size for per program button
         if program_length >= 10 and program_length <= 60:
             program_width = 342.06
         elif program_length >= 60 and program_length <= 90:
             program_width = 691.09
         elif program_length >= 90 and program_length <= 105:
             program_width = 879.10   


    self.program_buttons.append(ProgramControls(program_controls, program))
cur.close()
#create the buttons in the database
cur.execute('CREATE TABLE IF NOT EXISTS buttons(button_ids TEXT, button_width TEXT)')
programs_button = [elem.control for elem in self.program_buttons]
program_id = list()
program_width = list()

#generating the program button ids
for generate_ids in range(3002, 3485):
    program_id.append(generate_ids)
print program_id

for elem in programs_button:
    program_width.append(elem.getWidth())
print program_width
#store the buttons in the database
cur.execute("INSERT INTO buttons(button_ids, button_width)" + " VALUES(?, ?)", [program_id, program_width])

program_idprogram_width的数据类型是实际列表。

你知道为什么我有错误,你知道如何解决它吗?

2 个答案:

答案 0 :(得分:0)

您无法将列表插入数据库。相反,你必须做两件事之一:

  1. 通过插入每对来为每对创建一行。您可以使用.executemany()来有效地执行此操作。

  2. 序列化列表并将它们存储为整个列表的单个原始文本字符串,然后当您从数据库中读取它们时,反序列化字符串。为此,您可以使用所需的任何序列化机制,但json是一个相当简单的选项。

答案 1 :(得分:0)

要在表中插入单行,您需要调用cur.execute()作为其第一个参数,并使用两元素元组作为其第二个参数。元组的第一个元素将替换第一个参数标记,第二个元素替换第二个参数标记。您的调用为每个元素值提供列表而不是单个值。

要在表格中插入许多行,您应使用相同的第一个参数调用"INSERT INTO buttons(button_ids, button_width) VALUES(?, ?)"。但是,第二个参数应该是两元素元组序列,每个元素都应包含一个id值作为其第一个元素,而button-width作为其第二个元素。

由于您当前在单独的列表中有cur.executemany()program_id,因此首先要做的是列出两个元素的元组,每个元组包含每个列表的相应元素。那将是

program_width

完成此操作后,您可以将值用作values = zip(program_id, program_width) 的第二个参数,如

execute_many()

完成后不要忘记提交更改。