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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

SQLAlchemy

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

Python

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

Q&A

解決済

1回答

4318閲覧

Flask SQLAlchemyの attributeエラーについて

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

SQLAlchemy

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

Python

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

0グッド

0クリップ

投稿2023/02/04 12:25

Flask+SQLAlchemyでDBへデーターをimporしているのですが、データー投入用のinit_user.pyを実行すると以下のエラーが
出てしまします。python自体を再インストールし、コードも全て書き直して実行しても解決に至りません。

どこが、どのように間違っているのかご教示いただければと思います。

Traceback (most recent call last): File "C:\work\dev\FLASK\FLASK_DB\init_user.py", line 1, in <module> from app import db, User File "C:\work\dev\FLASK\FLASK_DB\app.py", line 19, in <module> db = SQLAlchemy(app) File "C:\Users\test\anaconda3\envs\flask_env\lib\site-packages\flask_sqlalchemy\__init__.py", line 758, in __init__ _include_sqlalchemy(self, query_class) File "C:\Users\test\anaconda3\envs\flask_env\lib\site-packages\flask_sqlalchemy\__init__.py", line 112, in _include_sqlalchemy for key in module.__all__: AttributeError: module 'sqlalchemy' has no attribute '__all__'. Did you mean: '__file__'?

python

1# app.py 2 3import os 4from flask import Flask 5from flask_sqlalchemy import SQLAlchemy 6 7app = Flask(__name__) 8 9app.config['SECRET_KEY'] ='test' 10 11# 現在のディレクトリ取得 12basedir = os.path.abspath(os.path.dirname(__file__)) 13 14# 環境変数設定 app.pyと同じdirにDBが作成される。 15app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.sqlite') 16 17# DBの変更履歴を必要とする 18app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 19 20# dbの作成 21db = SQLAlchemy(app) 22 23 24# 89 テーブル定義 25class User(db.Model): 26 __tablename__ = 'users' 27 28 id = db.Column(db.Integer, primary_key = True) 29 email = db.Column(db.String(64), unique=True, index=True) 30 username = db.Column(db.String(64), unique=True, index=True) 31 password_hash = db.Column(db.String(128)) 32 33 # classのインスタンス化 34 def __init__(self, email, username, password_hash): 35 self.email = email 36 self.username = username 37 self.password_hash = password_hash 38 39 # 特殊メソッド 画面出力を行う 値が設定されているか確認するため 40 def __repr__(self): 41 return f"Username: {self.username}" 42 43if __name__ == '__main__': 44 app.run(debug=True) 45

python

1# init_user.py 2from app import db, User 3 4db.create_all() 5 6user1 = User("test_user1@test.com", "Test User1", "111") 7user2 = User("test_user2@test.com", "Test User2", "111") 8db.session.add_all([user1, user2]) 9 10db.session.commit() 11 12print(user1.id)

<参考>
(flask_env) C:\work\dev\FLASK\FLASK_DB>pip list
Package Version


alembic 1.9.2
certifi 2022.12.7
click 8.1.3
colorama 0.4.6
dnspython 2.3.0
email-validator 1.1.3
Flask 2.0.3
Flask-Login 0.5.0
Flask-Migrate 3.1.0
Flask-SQLAlchemy 2.5.1
Flask-WTF 0.15.1
greenlet 2.0.2
idna 3.4
itsdangerous 2.1.2
Jinja2 3.0.3
Mako 1.2.4
MarkupSafe 2.1.2
Pillow 9.0.1
pip 22.3.1
pytz 2021.3
setuptools 65.6.3
SQLAlchemy 2.0.1
typing_extensions 4.4.0
Werkzeug 2.0.3
wheel 0.37.1
wincertstore 0.2
WTForms 2.3.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/changes/#version-3-0-2

Update compatibility with SQLAlchemy 2. #1122

https://github.com/pallets-eco/flask-sqlalchemy/issues/1122
と同じですね。SQLALchemyのバージョンを落とすか、Flask-SQLAlchemyのバージョンを3.0.2まで上げるかの選択だと思います。


追記
https://github.com/pallets-eco/flask-sqlalchemy/issues/1122
にて、flask-sqlalchemyに修正が入って
https://github.com/pallets-eco/flask-sqlalchemy/pull/1123
がMergeされています。

その内容は、SQLAlchemy 2 preview になってこういう変更があって動かなくなっていたから直したよというものです。
4点

  • SQLAlchemy no longer sets __all__.
  • SQLite uses QueuePool instead of NullPool.
  • Ignore LegacyAPIWarning when testing the legacy API. The lowest supported version, 1.4.18, does not have this class.
  • Can't use sa.Column[sa.Integer] as a type, ignore it in the one test that uses it.

で非互換があったから直していて、今回のエラーは1点目に該当します。
Flask-SQLAlchemy 3.0.2 に入る予定だとなっていて、実際3.0.2に反映されてリリースされています。

https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/changes/#version-3-0-2

Version 3.0.2
Released 2022-10-14
Update compatibility with SQLAlchemy 2. #1122

つまり SQLAlchemy 2系と組み合わせるならこれ以前の Flask-SQLAlchemy では駄目ということです。
今だと3.0.3が出ているので3.0.3にしてしまうのがいいでしょう。

投稿2023/02/04 14:31

編集2023/02/05 00:15
quickquip

総合スコア11209

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

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

退会済みユーザー

退会済みユーザー

2023/02/04 22:53

回答ありがとうございます。今までは、上記、pip listのパッケージで正しく動いていたのですが、昨日から突然このような状況になってしまいました。このような原因が発生する理由は分かりますでしょうか?
quickquip

2023/02/04 23:17

この構成ならコードがそうなるように書かれている以上 db = SQLAlchemy(app) を実行した時点で確実に発生するはずです。(コード読みましたか????) db = SQLAlchemy(app) を書いたのがはじめてなのか、SQLALchemyのバージョンが動いてしまったか、としか思えないです。
退会済みユーザー

退会済みユーザー

2023/02/04 23:39 編集

この構成ならコードがそうなるように書かれている以上 db = SQLAlchemy(app) を実行した時点で確実に発生するはずです。→なぜでしょう? >db = SQLAlchemy(app) を書いたのがはじめてなのか・・・ はい。初めて記載しました。 コードの書き方が良くないということでしょうか?
quickquip

2023/02/05 00:02 編集

それは「昨日から突然このような状況になってしまいました」とは言いませんよ
quickquip

2023/02/05 00:06

一回コメントを書きましたが、回答に反映して元のコメントは変更,削除しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問