Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将包含参数的元组作为要素的唯一值写入postgresql表_Python_Postgresql_Psycopg2 - Fatal编程技术网

Python 将包含参数的元组作为要素的唯一值写入postgresql表

Python 将包含参数的元组作为要素的唯一值写入postgresql表,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,在Python2.7中,使用功能ID作为键的字典。 有数千种功能。 每个特征都有一个值,但该值是一个元组,包含特征的6个参数(例如:大小、颜色等) 另一方面,我在数据库中有一个postgreSQL表,其中必须保存这些特性参数。 表中已经设置了功能的ID(以及有关这些功能的其他信息)。 ID是唯一的(它们是随机的(因此不是序列号),但是唯一的数字)。 共有6个空列,名称为:“param1”、“param2”、“param3”、“param6”。 我已经有了一个包含以下名称的元组: columns

在Python2.7中,使用功能ID作为键的字典。
有数千种功能。
每个特征都有一个值,但该值是一个元组,包含特征的6个参数(例如:大小、颜色等)

另一方面,我在数据库中有一个postgreSQL表,其中必须保存这些特性参数。
表中已经设置了功能的ID(以及有关这些功能的其他信息)。
ID是唯一的(它们是随机的(因此不是序列号),但是唯一的数字)。
共有6个空列,名称为:“param1”、“param2”、“param3”、“param6”。
我已经有了一个包含以下名称的元组:

columns = ("param1", "param2", "param3", ..., "param6")
我的代码无法将这些参数保存在每个功能的相应列中:

# "view" is the dictionary with features's ID as keys() 
# and their 6 params stored in values().
values  = [view[i] for i in view.keys()]
columns =  ("param1","param2","param3","param4","param5","param6")


conn = psycopg2.connect("dbname=mydb user=username password=password")
curs = conn.cursor() 

curs.execute("DROP TABLE IF EXISTS mytable;")
curs.execute("CREATE TABLE IF NOT EXISTS mytable (LIKE originaltable including defaults including constraints including indexes);")
curs.execute("INSERT INTO mytable SELECT * from originaltable;")

insertstatmnt  = 'INSERT INTO mytable (%s) values %s'
alterstatement = ('ALTER TABLE mytable '+
                  'ADD COLUMN param1 text,'+
                  'ADD COLUMN param2 text,'+
                  'ADD COLUMN param3 real,'+
                  'ADD COLUMN param4 text,'+
                  'ADD COLUMN param5 text,'+
                  'ADD COLUMN param6 text;'
                  )
curs.execute(alterstatement) # It's working up to this point.
curs.execute(insertstatmnt, (psycopg2.extensions.AsIs(','.join(columns)), tuple(values))) # The problem seems to be here.

conn.commit() # Making change to DB !
curs.close()
conn.close()
以下是我的错误:

curs.execute(insert_statement, (psycopg2.extensions.AsIs(','.join(columns)), tuple(values)))

ProgrammingError: INSERT has more expressions than target columns
我一定错过了什么。

如何正确地做到这一点

当使用“%s”来获得我认为您想要的语句时,您只需要更改几件事

忽略c.execute(),此语句决不是错误的,但它不会返回您要查找的内容。用我自己的说法,这就是我从那句话中得到的。我还忽略了psycopg2.extensions.AsIs(),因为它只是一个符合ISQLQuote协议的适配器,对于字符串表示形式已经作为SQL表示形式有效的对象非常有用

>>> values = [ i for i in range(0,5)] #being I dont know the keys, I just made up values.

>>> insertstatmnt, (','.join(columns), tuple(vlaues))
>>> ('INSERT INTO mytable (%s) values %s', ('param1,param2,param3,param4,param5,param6', (0, 1, 2, 3, 4)))
如您所见,您输入的内容将返回一个包含值的元组

>>> insertstatmnt % (','.join(columns), tuple(values))
>>> 'INSERT INTO mytable (param1,param2,param3,param4,param5,param6) values (0, 1, 2, 3, 4)'
其中,这将返回一个更有可能被SQL读取的字符串。这些值显然与指定的值不匹配。我相信你的问题在于创建你的字符串


pycopg2的参考:

因为我从这个线程获取了psycopg2命令的语法:

由于我的
字典与前面提到的示例并不完全遵循相同的结构(我也有一个键作为ID,就像在这个示例中一样,但我的字典只有一个对应值,作为包含我的6个参数的元组,因此“嵌套1个杠杆”而不是直接对应于键的6个值)我需要遍历所有功能,以对每个功能执行一条SQL语句:

[curs.execute(insertstatmnt, (psycopg2.extensions.AsIs(', '.join(columns)), i)) for i in tuple(values)].

这个,正在工作。

打印(元组(值))
显示什么?。数百MB。。。!简而言之:
values
最初是一个列表,其中包含每个特性的6个参数值。6值pro功能(有数千个功能)存储为列表中的单个元组。元组的6个元素中的每一个都是字符串,除了一个是数字。例如:
类型(值)
->
列表
类型(值[5617])
->
元组
,和
类型(值[5617][0])
类型(值[5617][5])
str除了
浮动
。其他地方可能也有
NoneType
。第二个不能用作
curs。execute()
需要两个输入参数,用逗号分隔,而不是百分号:
TypeError:不支持的操作数类型(&::'str'和'tuple'
@s.k百分号创建字符串,执行的包来自哪个?我可能在想另一个办法