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

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

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

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

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

Q&A

1回答

577閲覧

Django Mysqlを使用した埋め込みsql

tohokukagaku

総合スコア12

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

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

0グッド

0クリップ

投稿2019/03/11 04:02

編集2019/03/18 05:55

前提・実現したいこと

下記のコード tests.py と models.pyを用意してコマンドプロントからpython tests.pyを実行すると以下のようなエラーが出てしまいます。

しかし試しにview.pyに以下のようなコードを作成し、コマンドプロントから manage.py runserverを実行し tes2.htmlテンプレートを利用したweb画面のボタンから実行してみた場合、正常に処理できました。

どうして test.pyからはデータベースを扱うことができないのでしょうか?

test.pyからテスト用の埋め込みsqlを作成し、サーバーをいちいち稼働することなく論理エラーや文法エラーが出るか試したいので,ご教授お願いいたします。

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

Traceback (most recent call last): File "tests.py", line 2, in <module> import models File "C:\Python\mysite\myapp1\models.py", line 50, in <module> class Sqltes(models.Model): File "C:\Python\env1\lib\site-packages\django\db\models\base.py", line 87, in __new__ app_config = apps.get_containing_app_config(module) File "C:\Python\env1\lib\site-packages\django\apps\registry.py", line 249, in get_containing_app_config self.check_apps_ready() File "C:\Python\env1\lib\site-packages\django\apps\registry.py", line 131, in check_apps_ready settings.INSTALLED_APPS File "C:\Python\env1\lib\site-packages\django\conf\__init__.py", line 57, in __getattr__ self._setup(name) File "C:\Python\env1\lib\site-packages\django\conf\__init__.py", line 42, in _setup % (desc, ENVIRONMENT_VARIABLE)) django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

該当のソースコード

Django

1# tests.py 2 3import models 4 5b = Sqltes(id=4, name="new name4", testext="new text4" ) 6b.save()

Django

1# models.py 2 3import datetime 4 5from django.db import models 6from django.utils import timezone 7 8class Sqltes(models.Model): 9 id = models.IntegerField(primary_key=True) 10 name = models.CharField(max_length=255) 11 testext = models.CharField(max_length=255, blank=True, null=True) 12 13 class Meta: 14 managed = False 15 db_table = 'sqltes' 16

Django

1# views.py 2 3from django.http import HttpResponse 4from django.shortcuts import render 5from . import forms 6 7from .forms import MyForm 8from .models import * 9 10def tes_template(request): 11 #変数の初期数値は設定しなければならない 12 tes3 = "" 13 if request.method == 'POST': 14 b = Sqltes(id=4, name="new name4", testext="new text4") 15 b.save() 16 b = Sqltes.objects.get(pk=4) 17 tes3 = b.name 18 19 myapp_data = { 20 "tes1" : tes3, 21 } 22 return render(request, 'tes2.html' , myapp_data) 23

html

1# tes.html 2 3<!DOCTYPE html> 4<html lang="ja" dir="ltr"> 5 <head> 6 <meta charset="utf-8"> 7 <title></title> 8 <!-- UIkit CSS --> 9 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.25/css/uikit.min.css" /> 10 11 <!-- jQuery is required --> 12 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 13 14 <!-- UIkit JS --> 15 <script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.25/js/uikit.min.js"></script> 16 <script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.0.0-beta.25/js/uikit-icons.min.js"></script> 17 </head> 18 <body> 19 <form class="" action="" method="post"> 20 {% csrf_token %} {# ← post を使う場合のおまじない#} 21 22 <input class="uk-input" type="text" name="tes" value=""> 23 <input class="uk-text-large" type="submit" name="button" value="送 信"> 24 25 </form> 26 27 </body> 28</html>

Django

1""" 2Django settings for mysite project. 3 4Generated by 'django-admin startproject' using Django 2.1.5. 5 6For more information on this file, see 7https://docs.djangoproject.com/en/2.1/topics/settings/ 8 9For the full list of settings and their values, see 10https://docs.djangoproject.com/en/2.1/ref/settings/ 11""" 12 13import os 14 15# Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 18 19# Quick-start development settings - unsuitable for production 20# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ 21 22# SECURITY WARNING: keep the secret key used in production secret! 23SECRET_KEY = 'r4+r_%h^q1y=oclmulfbzp=%0(4batna5o%&s!$n)c^4%-ur4h' 24 25# SECURITY WARNING: don't run with debug turned on in production! 26DEBUG = True 27 28ALLOWED_HOSTS = [] 29 30 31# Application definition 32 33INSTALLED_APPS = [ 34 'django.contrib.admin', 35 'django.contrib.auth', 36 'django.contrib.contenttypes', 37 'django.contrib.sessions', 38 'django.contrib.messages', 39 'django.contrib.staticfiles', 40 'myapp1', 41 'crud', #追加分 42 43] 44 45MIDDLEWARE = [ 46 'django.middleware.security.SecurityMiddleware', 47 'django.contrib.sessions.middleware.SessionMiddleware', 48 'django.middleware.common.CommonMiddleware', 49 'django.middleware.csrf.CsrfViewMiddleware', 50 'django.contrib.auth.middleware.AuthenticationMiddleware', 51 'django.contrib.messages.middleware.MessageMiddleware', 52 'django.middleware.clickjacking.XFrameOptionsMiddleware', 53] 54 55ROOT_URLCONF = 'mysite.urls' 56 57TEMPLATES = [ 58 { 59 'BACKEND': 'django.template.backends.django.DjangoTemplates', 60 'DIRS': [ 61 os.path.join(BASE_DIR, 'templates'), 62 ], 63 'APP_DIRS': True, 64 'OPTIONS': { 65 'context_processors': [ 66 'django.template.context_processors.debug', 67 'django.template.context_processors.request', 68 'django.contrib.auth.context_processors.auth', 69 'django.contrib.messages.context_processors.messages', 70 ], 71 }, 72 }, 73] 74 75WSGI_APPLICATION = 'mysite.wsgi.application' 76 77 78# Database 79# https://docs.djangoproject.com/en/2.1/ref/settings/#databases 80 81DATABASES = { 82 'default': { 83 'ENGINE': 'django.db.backends.mysql', 84 'NAME': 'test', #データベース名 85 'USER': 'mysql', #ユーザー名 86 'PASSWORD': 'パスワード', #パスワード 87 'HOST': 'IPアドレス', #PCのIPアドレス(デフォルトは localhost ) 88 'PORT': 'ポート番号', #ポート番号 89 } 90} 91 92 93# Password validation 94# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators 95 96AUTH_PASSWORD_VALIDATORS = [ 97 { 98 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 99 }, 100 { 101 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 102 }, 103 { 104 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 105 }, 106 { 107 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 108 }, 109] 110 111 112# Internationalization 113# https://docs.djangoproject.com/en/2.1/topics/i18n/ 114 115LANGUAGE_CODE = 'en-us' 116 117TIME_ZONE = 'Asia/Tokyo' 118 119USE_I18N = True 120 121USE_L10N = True 122 123USE_TZ = True 124 125 126# Static files (CSS, JavaScript, Images) 127# https://docs.djangoproject.com/en/2.1/howto/static-files/ 128 129STATIC_URL = '/static/' 130```Django 131 132### 試したこと 133 134ここに問題に対して試したことを記載してください。 135 136Command==0.1.0 137Django==2.1.5 138django-uikit-admin==0.1.1 139django-uikit-editor==0.0.1 140pytz==2018.9 141Python 3.6.5

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

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

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

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

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

t_obara

2019/03/13 08:10

エラーに記載の通りかと思いますが、その点はご確認されたのでしょうか? Table 'test_test.sqltes' doesn't exist
tohokukagaku

2019/03/14 07:41

ご回答ありがとうございます。 テストはテスト用のデータベースを作成して、そこにテーブルを自動的にmigrateしてテストが終わったら自動的に消去されるものだと思っていたのですが違うのでしょうか? なのでなぜsqltesがテスト用のデータベースを作成後にmigrateされないかがわからないのですが、そもそも考え方間違っていましたか?
t_obara

2019/03/14 08:46

migrateってsettings.pyを元に、「python manage.py migrate」で行うのでは?
tohokukagaku

2019/03/15 01:38

python manage.py migrate は既に行っています。 TestCaseクラスを通さずにmanage.py runserverをして開発用のサーバから同じ処理をした場合は問題なく処理ができています。 ただtestとして行うとエラーが起きてしまう状況です。
t_obara

2019/03/15 03:47

testとして行う用の設定をsettings.pyにして、manage.py を行い、その後にtestをしている?
tohokukagaku

2019/03/18 05:57

それはしていませんでした。 setting.py について調べてきます。 念のためsetting.py の中身も編集して追加しましたので、お手数ですがご確認お願いいたします。
t_obara

2019/03/18 08:36

test時にテーブルがないと言われているので、テストように準備したDBの中に利用するテーブルがないのでしょう?それはいつ作るのですか?
tohokukagaku

2019/03/18 09:15

すみません。その設定のやり方を詳しく教えていただけませんか? テスト開始したらdjangoの方で自動でテスト用のdbとテーブルを作成して、終わったら消されるのだと思っていましたので。
t_obara

2019/03/18 09:48

なるほど。すでに回答されている通りで、テスト実行方法がそこに記載のリンクに示された方法で実行されていないのでは? $ python manage.py test polls
guest

回答1

0

エラー文に書いてあるとおり、Djangoのモデルを扱うには、INSTALLED_APPS等を設定ファイルから読み込む必要があるためです。

django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

とはいえ、テストのために毎回サーバを動かすのは面倒、と感じるのはもっともなことです。
Djangoにはユニットテスト機能がついているので、これを使ってモデルやビューをテストしてみてください。

https://docs.djangoproject.com/ja/2.1/intro/tutorial05/

投稿2019/03/11 05:59

Udomomo

総合スコア1524

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

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

tohokukagaku

2019/03/11 07:21 編集

回答してくださりありがとうございます。 リンク先の情報に従いコードを下記のように修正しました。 ```django import datetime from django.test import TestCase from django.utils import timezone from .models import * class Tests(TestCase): def test(self): b = Sqltes(id=5, name="new name5", testext="new text5" ) b.save() ``` しかし、下記のようなエラーが出てしまいました。 ```コマンドプロント Creating test database for alias 'default'... System check identified no issues (0 silenced). E ====================================================================== ERROR: test (myapp1.tests.Tests) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:\Python\env1\lib\site-packages\django\db\backends\utils.py", line 85, in _execute return self.cursor.execute(sql, params) File "C:\Python\env1\lib\site-packages\django\db\backends\mysql\base.py", line 71, in execute return self.cursor.execute(query, args) File "C:\Python\env1\lib\site-packages\pymysql\cursors.py", line 170, in execute result = self._query(query) File "C:\Python\env1\lib\site-packages\pymysql\cursors.py", line 328, in _query conn.query(q) File "C:\Python\env1\lib\site-packages\pymysql\connections.py", line 517, in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) File "C:\Python\env1\lib\site-packages\pymysql\connections.py", line 732, in _read_query_result result.read() File "C:\Python\env1\lib\site-packages\pymysql\connections.py", line 1075, in read first_packet = self.connection._read_packet() File "C:\Python\env1\lib\site-packages\pymysql\connections.py", line 684, in _read_packet packet.check_error() File "C:\Python\env1\lib\site-packages\pymysql\protocol.py", line 220, in check_error err.raise_mysql_exception(self._data) File "C:\Python\env1\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception raise errorclass(errno, errval) pymysql.err.ProgrammingError: (1146, "Table 'test_test.sqltes' doesn't exist") The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Python\mysite\myapp1\tests.py", line 15, in test b.save() File "C:\Python\env1\lib\site-packages\django\db\models\base.py", line 718, in save force_update=force_update, update_fields=update_fields) File "C:\Python\env1\lib\site-packages\django\db\models\base.py", line 748, in save_base updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) File "C:\Python\env1\lib\site-packages\django\db\models\base.py", line 812, in _save_table forced_update) File "C:\Python\env1\lib\site-packages\django\db\models\base.py", line 861, in _do_update return filtered._update(values) > 0 File "C:\Python\env1\lib\site-packages\django\db\models\query.py", line 712, in _update return query.get_compiler(self.db).execute_sql(CURSOR) File "C:\Python\env1\lib\site-packages\django\db\models\sql\compiler.py", line 1383, in execute_sql cursor = super().execute_sql(result_type) File "C:\Python\env1\lib\site-packages\django\db\models\sql\compiler.py", line 1065, in execute_sql cursor.execute(sql, params) File "C:\Python\env1\lib\site-packages\django\db\backends\utils.py", line 68, in execute return self._execute_with_wrappers(sql, params, many=False, executor=self._execute) File "C:\Python\env1\lib\site-packages\django\db\backends\utils.py", line 77, in _execute_with_wrappers return executor(sql, params, many, context) File "C:\Python\env1\lib\site-packages\django\db\backends\utils.py", line 85, in _execute return self.cursor.execute(sql, params) File "C:\Python\env1\lib\site-packages\django\db\utils.py", line 89, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "C:\Python\env1\lib\site-packages\django\db\backends\utils.py", line 85, in _execute return self.cursor.execute(sql, params) File "C:\Python\env1\lib\site-packages\django\db\backends\mysql\base.py", line 71, in execute return self.cursor.execute(query, args) File "C:\Python\env1\lib\site-packages\pymysql\cursors.py", line 170, in execute result = self._query(query) File "C:\Python\env1\lib\site-packages\pymysql\cursors.py", line 328, in _query conn.query(q) File "C:\Python\env1\lib\site-packages\pymysql\connections.py", line 517, in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) File "C:\Python\env1\lib\site-packages\pymysql\connections.py", line 732, in _read_query_result result.read() File "C:\Python\env1\lib\site-packages\pymysql\connections.py", line 1075, in read first_packet = self.connection._read_packet() File "C:\Python\env1\lib\site-packages\pymysql\connections.py", line 684, in _read_packet packet.check_error() File "C:\Python\env1\lib\site-packages\pymysql\protocol.py", line 220, in check_error err.raise_mysql_exception(self._data) File "C:\Python\env1\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception raise errorclass(errno, errval) django.db.utils.ProgrammingError: (1146, "Table 'test_test.sqltes' doesn't exist") ---------------------------------------------------------------------- Ran 1 test in 0.349s FAILED (errors=1) Destroying test database for alias 'default'... ``` 一番最初に b.save()を入れてない状態で python manage.py test myapp1をしたときはうまくいったのですが、その後 saveをしていないことに気づき、更新されていなかったため、b.save()を追加したらエラーが出るようになりました。 大変申し訳ございませんが、ご回答お願い致します。
tohokukagaku

2019/03/11 08:30

```django b = Sqltes.objects.get(pk=4) ``` どうやら上記のデータの呼び出しでも同じようなエラーが来たためデータベースにアクセスしようとするとエラーが起きるようです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問