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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

SQLAlchemy

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

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

Q&A

解決済

1回答

1658閲覧

SQLAlchemyのエラー(UnmappedInstanceError)の原因について

hiroikawa55

総合スコア26

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

SQLAlchemy

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

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

0グッド

0クリップ

投稿2019/12/05 08:37

PostgreSQLに、SQLAlchemyを用いて接続し、モデルを定義の上、フォルダ内のテキスト(Html形式)をデータベースに追加しようとしています。
以下のコードを実行したところ、以下のようなエラーメッセージが出てしまいます。申し訳ありません。どなかたエラーの原因がわかる方、ご教示いただけないでしょうか。
どうぞよろしくお願い申し上げます。


AttributeError
Traceback (most recent call last)
/opt/conda/lib/python3.7/site-packages/sqlalchemy/orm/session.py in add(self, instance, _warn)
1942 try:
-> 1943 state = attributes.instance_state(instance)
1944 except exc.NO_STATE:

AttributeError: 'tuple' object has no attribute '_sa_instance_state'

During handling of the above exception, another exception occurred:

UnmappedInstanceError
Traceback (most recent call last)
<ipython-input-33-81f0ea7b0027> in <module>
9 print('scraped:', title)
10 url = 'https://ja.wikipedia.org/wiki/{0}'.format(urllib.parse.quote(title))
---> 11 session.add((text, json.dumps({'url': url, 'title': title})))
12 session.commit()
13 session.close()

/opt/conda/lib/python3.7/site-packages/sqlalchemy/orm/session.py in add(self, instance, _warn)
1943 state = attributes.instance_state(instance)
1944 except exc.NO_STATE:
-> 1945 raise exc.UnmappedInstanceError(instance)
1946
1947 self._save_or_update_state(state)

UnmappedInstanceError: Class 'builtins.tuple' is not mapped

python

1import sqlalchemy 2from sqlalchemy import create_engine 3from sqlalchemy.engine.url import URL 4url = URL(drivername='postgresql', username='postgres', password = '<password>', host = 'localhost', database = 'test') 5url 6engine = create_engine(url) 7engine 8from sqlalchemy.ext.declarative import declarative_base 9from sqlalchemy import Column, Integer, String 10Base = declarative_base() 11class User(Base): 12 __tablename__ = 'users' 13 14 id = Column(Integer, primary_key=True) 15 content = Column(String) 16 meta_info = Column(String) 17 18from sqlalchemy.orm import sessionmaker 19session = sessionmaker(bind=engine)() 20import re 21import unicodedata 22 23from bs4 import BeautifulSoup 24translation_table = str.maketrans(dict(zip('()!', '()!'))) 25 26def cleanse(text): 27 text = unicodedata.normalize('NFKC', text).translate(translation_table) 28 text = re.sub(r'\s+', ' ', text) 29 return text 30 31def scrape(html): 32 soup = BeautifulSoup(html, 'html.parser') 33 # __EOS__ の挿入 34 for block in soup.find_all(['br', 'p', 'h1', 'h2', 'h3', 'h4']): 35 if len(block.text.strip()) > 0 and block.text.strip()[-1] not in ['。', '!']: 36 block.append('<__EOS__>') 37 # 本文の抽出 38 text = '\n'.join([cleanse(block.text.strip()) 39 for block in soup.find_all(['p', 'h1', 'h2', 'h3', 'h4']) 40 if len(block.text.strip()) > 0]) 41 # タイトルの抽出 42 title = cleanse(soup.title.text.replace(' - Wikipedia', '')) 43 return text, title 44 45import glob 46import urllib.request 47import json 48users = [] 49for filename in glob.glob('./data/wikipedia/*.html'): 50 with open(filename) as fin: 51 html = fin.read() 52 text, title = scrape(html) 53 print('scraped:', title) 54 url = 'https://ja.wikipedia.org/wiki/{0}'.format(urllib.parse.quote(title)) 55 session.add((text, json.dumps({'url': url, 'title': title}))) 56 session.commit() 57 session.close() 58コード

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

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

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

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

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

guest

回答1

0

自己解決

すみません、そもそもの構文が整理されていないので、もう少し検討してから再度質問したいと思います。

投稿2019/12/05 08:51

hiroikawa55

総合スコア26

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問