質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

10442閲覧

pandasのto_sqlでPostgreSQLにデータを書き込もうとするとエラー

marururu

総合スコア23

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/03/24 07:03

編集2020/03/24 07:22

前提・実現したいこと

PostgreSQLにPandasのto_sqlでデータを書き込もうとすると、以下のエラーが出力されます
AttributeError: 'Engine' object has no attribute 'cursor'
sqlalchemyのcreate_engineでengineを変更しているはずなのですが、うまくいきません。 
pandasのversionで何か変更があったのでしょうか…?
それともpandasとsqlalchemyのバージョンの相性があるのでしょうか…?

ソースコード

python

1import pandas as pd 2import psycopg2 3from sqlalchemy import create_engine 4 5df=pd.DataFrame(np.arange(6).reshape(2,3),columns=["a","b","c"]) #適当なDataFrame 6 7connection_config = { 8 'user': 'postgres', 9 'password': 'hogehoge', 10 'host': 'fugafuga', 11 'port': '5432', 12 'database': 'sampledb' 13} 14 15engine = create_engine('postgresql://{user}:{password}@{host}:{port}/{database}'.format(**connection_config),echo=False) 16df.to_sql("table_test",con=engine,if_exists="replace") 17

発生しているエラーメッセージ

python

1--------------------------------------------------------------------------- 2AttributeError Traceback (most recent call last) 3<ipython-input-132-d290ff87c057> in <module> 4----> 1 df.to_sql("table_test3",con=engine,if_exists="replace") 5 6~\Miniconda3\envs\py\lib\site-packages\pandas\core\generic.py in to_sql(self, name, con, schema, if_exists, index, index_label, chunksize, dtype, method) 7 2710 chunksize=chunksize, 8 2711 dtype=dtype, 9-> 2712 method=method, 10 2713 ) 11 2714 12 13~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in to_sql(frame, name, con, schema, if_exists, index, index_label, chunksize, dtype, method) 14 516 chunksize=chunksize, 15 517 dtype=dtype, 16--> 518 method=method, 17 519 ) 18 520 19 20~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in to_sql(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype, method) 21 1747 dtype=dtype, 22 1748 ) 23-> 1749 table.create() 24 1750 table.insert(chunksize, method) 25 1751 26 27~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in create(self) 28 639 29 640 def create(self): 30--> 641 if self.exists(): 31 642 if self.if_exists == "fail": 32 643 raise ValueError( 33 34~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in exists(self) 35 626 36 627 def exists(self): 37--> 628 return self.pd_sql.has_table(self.name, self.schema) 38 629 39 630 def sql_schema(self): 40 41~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in has_table(self, name, schema) 42 1760 ).format(wld=wld) 43 1761 44-> 1762 return len(self.execute(query, [name]).fetchall()) > 0 45 1763 46 1764 def get_table(self, table_name, schema=None): 47 48~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in execute(self, *args, **kwargs) 49 1588 cur = self.con 50 1589 else: 51-> 1590 cur = self.con.cursor() 52 1591 try: 53 1592 if kwargs: 54 55AttributeError: 'Engine' object has no attribute 'cursor'

試したこと

stackoverflowに以下を試してみて!との記載を見つけたので確認しましたが、以下のような結果でした。
そのあとのコメントは途絶えており参考にできませんでした。

python

1import sqlalchemy 2isinstance(engine,sqlalchemy.engine.Engine) 3#結果: True 4 5pd.io.sql._is_sqlalchemy_connectable(engine) 6#結果: False

sqlalchemyのサイトを見ると、以下のようにあったので、試しにengine = create_engine('postgresql+psycopg2://<接続定義>')のようにしてみましたが、結果は変わらずでした。

The PostgreSQL dialect uses psycopg2 as the default DBAPI. pg8000 is also available as a pure-Python substitute:

python

1# default 2engine = create_engine('postgresql://scott:tiger@localhost/mydatabase') 3 4# psycopg2 5engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase') 6 7# pg8000 8engine = create_engine('postgresql+pg8000://scott:tiger@localhost/mydatabase')

engine=engine.connect()としてみて」との記載もあったのですが、結果変わらずです。こちらはsqliteへの書き込み処理に関する質問に記載されていたので的外れかもしれませんが…。

python

1--------------------------------------------------------------------------- 2AttributeError Traceback (most recent call last) 3<ipython-input-186-d290ff87c057> in <module> 4----> 1 df.to_sql("table_test3",con=engine,if_exists="replace") 5(省略) 6AttributeError: 'Connection' object has no attribute 'cursor'

engine=engine.raw_connection()としたらうまくいったよ」とのstackoverflowを見つけたので試してみましたが、また別のエラーになりました。こちらも上記同様、sqliteへの書き込み処理に関する手順みたいなので、本件とは的外れだと思いますが…。

python

1--------------------------------------------------------------------------- 2UndefinedTable Traceback (most recent call last) 3~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in execute(self, *args, **kwargs) 4 1594 else: 5-> 1595 cur.execute(*args) 6 1596 return cur 7 8UndefinedTable: リレーション"sqlite_master"は存在しません 9LINE 1: SELECT name FROM sqlite_master WHERE type='table' AND name=?... 10 ^ 11 12 13During handling of the above exception, another exception occurred: 14 15DatabaseError Traceback (most recent call last) 16<ipython-input-144-712d0d3b6b3e> in <module> 17 1 # PostgreSQLに書き込む 18----> 2 df.to_sql('table_test2', con=engine, if_exists='replace', index=False) 19 20~\Miniconda3\envs\py\lib\site-packages\pandas\core\generic.py in to_sql(self, name, con, schema, if_exists, index, index_label, chunksize, dtype, method) 21 2710 chunksize=chunksize, 22 2711 dtype=dtype, 23-> 2712 method=method, 24 2713 ) 25 2714 26 27~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in to_sql(frame, name, con, schema, if_exists, index, index_label, chunksize, dtype, method) 28 516 chunksize=chunksize, 29 517 dtype=dtype, 30--> 518 method=method, 31 519 ) 32 520 33 34~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in to_sql(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype, method) 35 1747 dtype=dtype, 36 1748 ) 37-> 1749 table.create() 38 1750 table.insert(chunksize, method) 39 1751 40 41~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in create(self) 42 639 43 640 def create(self): 44--> 641 if self.exists(): 45 642 if self.if_exists == "fail": 46 643 raise ValueError( 47 48~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in exists(self) 49 626 50 627 def exists(self): 51--> 628 return self.pd_sql.has_table(self.name, self.schema) 52 629 53 630 def sql_schema(self): 54 55~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in has_table(self, name, schema) 56 1760 ).format(wld=wld) 57 1761 58-> 1762 return len(self.execute(query, [name]).fetchall()) > 0 59 1763 60 1764 def get_table(self, table_name, schema=None): 61 62~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in execute(self, *args, **kwargs) 63 1608 "Execution failed on sql '{sql}': {exc}".format(sql=args[0], exc=exc) 64 1609 ) 65-> 1610 raise_with_traceback(ex) 66 1611 67 1612 @staticmethod 68 69~\Miniconda3\envs\py\lib\site-packages\pandas\compat\__init__.py in raise_with_traceback(exc, traceback) 70 44 if traceback == Ellipsis: 71 45 _, _, traceback = sys.exc_info() 72---> 46 raise exc.with_traceback(traceback) 73 47 74 48 75 76~\Miniconda3\envs\py\lib\site-packages\pandas\io\sql.py in execute(self, *args, **kwargs) 77 1593 cur.execute(*args, **kwargs) 78 1594 else: 79-> 1595 cur.execute(*args) 80 1596 return cur 81 1597 except Exception as exc: 82 83DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': リレーション"sqlite_master"は存在しません 84LINE 1: SELECT name FROM sqlite_master WHERE type='table' AND name=?... 85 ^

to_sqlの使い方を紹介するページには特に何の言及もないようなので、どうすべきかわかりません。
何が原因なのか、当方でどうトラブルシュートしていけばいいか、当方もpython初心者につき見当がつきません…。
何卒ご助力いただきたくよろしくお願いします。

参考にしたページ

[Qiita][python] pandasのDataFrameからpostgresにテーブルを作成(2016年09月30日)
[その他]PandasのDataFrameでPostgreSQLに読み書きする方法(2020年1月15日)
[teratail]pandasのdataframeをto_sqlするとDatabaseErrorになる(解決済 回答2 投稿 2018/02/20 13:18)
[stackoverflow]Writing to PostgreSQL from pandas: AttributeError: 'Engine' object has no attribute 'cursor'(
Asked 4 years, 3 months ago
Viewed 2k times
)

バージョン

Python 3.7.4
pandas 0.25.1
psycopg2 2.8.4 (dt dec pq3 ext lo64)
sqlalchemy 1.3.15
postgres PostgreSQL 10.11, compiled by Visual C++ build 1800, 64-bit

補足事項

pythonのターミナルで直書きしたら、特にエラーなくいけました。
開発環境としてjupyter notebookを使っているのですが、まさかこれが原因……??
ご意見いただきたくよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

schema='piyopiyo'を設定してなかっただけでした。

python

1df.to_sql(name="table_test",schema='schema_test',con=engine,if_exists="replace",index=False)

投稿2020/03/24 07:46

marururu

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問