Python psycopg2使用类对象列表执行_值

Python psycopg2使用类对象列表执行_值,python,psycopg2,Python,Psycopg2,我有一个类Person,具有id、fname和lname。我的程序将有一个很大的Person对象列表,我想将其插入我的PostgreSQL数据库 我想通过psycopg2.execute\u values方法来实现这一点,该方法要求为我的类定义\uuuuu getitem\uuuuu \uuuu getitem\uuuuu当前正在返回元组(id,fname,lname),这将导致pscopg2.execute\u values尝试执行:插入个人(id,fname,lname)值((1,'test

我有一个类
Person
,具有
id
fname
lname
。我的程序将有一个很大的
Person
对象列表,我想将其插入我的
PostgreSQL
数据库

我想通过
psycopg2.execute\u values
方法来实现这一点,该方法要求为我的类定义
\uuuuu getitem\uuuuu

\uuuu getitem\uuuuu
当前正在返回
元组(id,fname,lname)
,这将导致
pscopg2.execute\u values
尝试执行:
插入个人(id,fname,lname)值((1,'test1','test1')…

import psycopg2.extras


class Person:
    def __init__(self, id, fname, lname):
        self.id = id
        self.fname = fname
        self.lname = lname

    def __len__(self):
        return 1

    def __getitem__(self, item):
        return self.id, self.fname, self.lname


dsn = "user=my_user host=localhost port=5432 dbname=my_db"
query = "insert into persons(id, fname, lname) values %s"

p1 = Person(1, 'test1', 'test1')
p2 = Person(2, 'test2', 'test2')

records = list()
records.append(p1)
records.append(p2)
with psycopg2.connect(dsn=dsn) as conn:
    with conn.cursor() as cursor:
        psycopg2.extras.execute_values(cursor, query, records, template=None, page_size=1000)

psycopg2.ProgrammingError: INSERT has more target columns than expressions
LINE 1: insert into persons(id, fname, lname) values ((1, 'test1', 'test1'))...
                                ^
HINT:  The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?
使用
namedtuple
可以:

from collections import namedtuple
import psycopg2.extras


Person = namedtuple('Person', ['id', 'fname', 'lname'])

dsn = "user=my_user host=localhost port=5432 dbname=my_db"
query = "insert into persons(id, fname, lname) values %s"

p1 = Person(1, 'test1', 'test1')
p2 = Person(2, 'test2', 'test2')

records = list()
records.append(p1)
records.append(p2)

with psycopg2.connect(dsn=dsn) as conn:
    with conn.cursor() as cursor:
        psycopg2.extras.execute_values(cursor, query, records, template=None, page_size=1000)
但是,我想实现一个不同的
\uuuuuueq\uuuu
\uuuuuuhash\uuuu
实现。如果有一种方法可以覆盖
namedtuple
的这些方法,那么我愿意使用这种方法

否则,我如何修改
\uu getitem\uuu
以分别返回
id
fname
lname
,从而使查询变为:

insert into persons(id, fname, lname) values (1, 'test1', 'test1')...

定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
似乎可以达到以下目的:

不确定这是否是推荐的方法,因此我将保持此打开状态,希望有人插话

import psycopg2.extras
from psycopg2.extensions import AsIs, ISQLQuote


class Person:
    def __init__(self, id, fname, lname):
        self.id = id
        self.fname = fname
        self.lname = lname

    def __len__(self):
        return 1

    def __getitem__(self, key):
        return self

    def __conform__(self, protocol):
        if protocol is ISQLQuote:
            return AsIs("{id}, '{fname}', '{lname}'".format(id=self.id, fname=self.fname, lname=self.lname))

        return None


dsn = "user=my_user host=localhost port=5432 dbname=my_db"
query = "insert into persons(id, fname, lname) values %s"

p1 = Person(1, 'test1', 'test1')
p2 = Person(2, 'test2', 'test2')

records = list()
records.append(p1)
records.append(p2)

with psycopg2.connect(dsn=dsn) as conn:
    with conn.cursor() as cursor:
        psycopg2.extras.execute_values(cursor, query, records, template=None, page_size=1000)