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