Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mXRBB-0000Vq-2s for pgsql-general@arkaria.postgresql.org; Mon, 04 Oct 2021 16:51:05 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1mXRB9-00032Z-F5 for pgsql-general@arkaria.postgresql.org; Mon, 04 Oct 2021 16:51:03 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mXRB8-00032Q-3L for pgsql-general@lists.postgresql.org; Mon, 04 Oct 2021 16:51:03 +0000 Received: from out3-smtp.messagingengine.com ([66.111.4.27]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mXRB1-0001HN-22 for pgsql-general@lists.postgresql.org; Mon, 04 Oct 2021 16:51:01 +0000 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 060FB5C007F; Mon, 4 Oct 2021 12:50:54 -0400 (EDT) Received: from mailfrontend2 ([10.202.2.163]) by compute4.internal (MEProxy); Mon, 04 Oct 2021 12:50:54 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=aklaver.com; h= subject:to:cc:references:from:message-id:date:mime-version :in-reply-to:content-type:content-transfer-encoding; s=fm1; bh=a lltsLP/D3dkifX1UoJUJHXXZKwKMUg5RAYRFyQqiR0=; b=NbmquU9IwdbIRuASF 8pdzWpK055LOMElHiCQLacsLErPE9uPhJtKeG4C9n6y1JqiBxtJDXXq3iWTHamSq 1HQVPHMbsteuKv5IuiVpCD4oYjSr6e50LoDpzM2r7oYGMfmv9y6NzwcTt6Mk/UPA nMEA+8U1aTx7oC1BUK0l8o525c8ixTXvgU4rhBkrLcCmknTQ5wfppHnKydQJtZkD 33vvjizEm08e9KUGDVLiWO2zfhMJ9sUG3LXcGGlQa9Z8CR5mprjnQOQ2vQ81kI8B 7lBoU8ZyE+B0iHQvAqN4OIBgJaTIDufdGfbNu51KIvEqLCE8CPCorRKbEtztZ1lQ gQs8g== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:content-type :date:from:in-reply-to:message-id:mime-version:references :subject:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm1; bh=alltsLP/D3dkifX1UoJUJHXXZKwKMUg5RAYRFyQqi R0=; b=EvYKA/wW9EDOr4vq8kZsFnK+616Kr/+KQ2fVXsRZefQbl12fnJjSpzS6i Yec0tY6ovdGzTz1gXzGCp6mSmi1O+KAo5xCP1lW6WLNtsoyiddMcEMbR24UEHqPa Spk3h6CZEIqiZwS3s7BFuhxfmawBW8Uf9XnirL/2VGP8Lfc7tEBSsmNyG3iFDxmf dO8a7ieIAaioZz3SWionVsSg8VMXPwJkzTRMth442ewP5P1C15l3qK3pCux8KPzR Ji8Cw82ZQoXkhNiixX5GueCtKgv9SjIwUP91Rzz3gpvuIN7ZNd89aSd6YX8pLXFc bIz3N/Uk81EDXdWh4Opf2Rz2+Wg4Q== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvtddrudelvddguddtvdcutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfgh necuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd enucfjughrpefuvfhfhffkffgfgggjtgfgsehtkeertddtfeejnecuhfhrohhmpeetughr ihgrnhcumfhlrghvvghruceorggurhhirghnrdhklhgrvhgvrhesrghklhgrvhgvrhdrtg homheqnecuggftrfgrthhtvghrnhepffeltdffjeduteelhfekleelfefghedtkeelhffh ueetveffvdetheekvdfhkeeunecuffhomhgrihhnpehtrggslhgvrdhnrghmvgenucevlh hushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpegrughrihgrnhdr khhlrghvvghrsegrkhhlrghvvghrrdgtohhm X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 4 Oct 2021 12:50:53 -0400 (EDT) Subject: Re: Testing of a fast method to bulk insert a Pandas DataFrame into Postgres To: Shaozhong SHI Cc: pgsql-general References: From: Adrian Klaver Message-ID: <1b86e754-0317-84df-848f-9218e8df73e9@aklaver.com> Date: Mon, 4 Oct 2021 09:50:52 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk On 10/4/21 9:20 AM, Shaozhong SHI wrote: > Hello, Adrian Klaver, > > Pandas version is 0.23.0. The reason the below does not work is method did not show up until pandas 0.24.0. > > I used the following code: > > def psql_insert_copy(table, conn, keys, data_iter): >     # gets a DBAPI connection that can provide a cursor >     dbapi_conn = conn.connection >     with dbapi_conn.cursor() as cur: >         s_buf = StringIO() >         writer = csv.writer(s_buf) >         writer.writerows(data_iter) >         s_buf.seek(0) > >         columns = ', '.join('"{}"'.format(k) for k in keys) >         if table.schema: >             table_name = '{}.{}'.format(table.schema, table.name > ) >         else: >             table_name = table.name > >         sql = 'COPY {} ({}) FROM STDIN WITH CSV'.format( >             table_name, columns) >         cur.copy_expert(sql=sql, file=s_buf) > engine = create_engine('postgresql+psycopg2://:5432/postgres') > try: >     df.to_sql('test1', engine, schema='public', if_exists='append', > index=False, method=psql_insert_copy) > > I could not find obvious reasons. > > Regards, > > David > -- Adrian Klaver adrian.klaver@aklaver.com