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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1792閲覧

Pythonで同一ファイル内のクラスを読み込んでくれません

nerianighthawk

総合スコア544

PostgreSQL

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/06/10 11:55

編集2018/06/10 14:16

前提・実現したいこと

Pythonは昨日から触り始めたばかりで、初歩的な質問かもしれませんが、よろしくお願いします。
下記のQiitaの記事にしたがってPythonでREST APIを実装しようとしています。
PythonでREST APIをサクっと実装
記事との違いとして、環境が

  • Mac OS 10.13.4
  • Python 3.6.2
  • PostgreSQL 10.4

となっています。
記事ではSQLiteですが、PostgreSQLで実装を行おうとしています。

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

発生しているエラーは単純にUserクラスが定義されていないという内容です。

>>> user = User.get(User.userId == userId) Traceback (most recent call last): File "<input>", line 1, in <module> NameError: name 'User' is not defined

該当のソースコード

Python

1# -*- coding: utf-8 -*- 2from flask import Flask, jsonify, abort, make_response 3import peewee 4from playhouse.postgres_ext import PostgresqlExtDatabase 5# import json 6 7db = PostgresqlExtDatabase( 8 database='data', 9 user='postgres', 10 password="*******", 11 host="127.0.0.1", 12 port=5432, 13 register_hstore=False) 14 15 16class User(peewee.Model): 17 userId = peewee.TextField() 18 userCompany = peewee.TextField() 19 userDiscountRate = peewee.IntegerField() 20 21 class Meta: 22 database = db 23 24 25api = Flask(__name__) 26 27 28@api.route('/getUser/<string:userId>', methods=['GET']) 29def get_user(userId): 30 try: 31 user = User.get(User.userId == userId) 32 except User.DoesNotExist: 33 abort(404) 34 35 result = { 36 "result": True, 37 "data": { 38 "userId": user.userId, 39 "userCompany": user.userCompany, 40 "userDiscountRate": user.userDiscountRate 41 } 42 } 43 44 return make_response(jsonify(result)) 45 # Unicodeにしたくない場合は↓ 46 # return make_response(json.dumps(result, ensure_ascii=False)) 47 48 49@api.errorhandler(404) 50def not_found(error): 51 return make_response(jsonify({'error': 'Not found'}), 404) 52 53 54if __name__ == '__main__': 55 api.run(host='0.0.0.0', port=3000) 56

試したこと

エラー文で検索すると、基本的にimportされていないことが原因だと書いてありますが、
今回の場合、Userクラスは同ファイル内にあり、importの必要はないと考えています。
エラー自体はとても初歩的なエラーだと思うので、簡単な理由かもしれませんが、よろしくお願いします。

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

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

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

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

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

quickquip

2018/06/10 14:10

エラーが出ている行とTracebackの情報が欲しいですね
quickquip

2018/06/10 14:23

何をどうやって実行しているんですか? ソースコードをファイルに保存して(例えば python api.pi のように)コマンド実行しているのではない?
nerianighthawk

2018/06/10 15:14

すみません、どうやらPycharmの使い方を間違っていたようです。1行だけの実行になっていました。Pythonどうのこうの以前の問題でした。
guest

回答1

0

自己解決

質問事項に記述しているエラーの原因はPythonのソースの問題ではなく、実行方法の問題でした。
user = User.get(User.userId == userId)1行の実行になっていたので、そうなった経緯を下記に記述します。

質問事項に記述していない前提として、私はPycharmを使っています。
上記勘違いに至るまでにいくつか過程があるのですが、まず上記ソースをコマンドラインよりPython3 api.pyというように実行していました。
しかし、クエリを飛ばしても404が返ってきてしまったため、user = User.get(User.userId == userId)の部分がおかしいと考えました(get_userメソッドのexcept側を通って404となっていることは確認済み)。
そして、このソースを書く前に簡単なソースを書いて実行したりしていたのですが、その時にたまたまcontrol + shift + eキー(Macのcontrolキー)でPython consoleから実行できることに気づきました。
便利だと思って覚えていたのですが、これが現在カーソルのある行の1行を実行するものらしく、ちょうどuser = User.get(User.userId == userId)の部分にカーソルがあったため、そこでクラスが定義されていないというエラーが起きていると勘違いしました。

また、404が返ってくる理由も単純にimportがうまくいっていなかったことでした。
自分で原因を特定しようとした結果、より間違った方向に進んでしまいました。大変お騒がせしました。

投稿2018/06/11 10:43

編集2018/06/11 10:54
nerianighthawk

総合スコア544

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問