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

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

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

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

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

SQLAlchemy

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

Python

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

Q&A

解決済

1回答

2852閲覧

(Flask・Flask-SQLAlchemy)DBにデータを格納できない

coco53

総合スコア4

Flask

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

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

SQLAlchemy

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

Python

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

0グッド

1クリップ

投稿2019/09/04 10:34

編集2019/09/05 13:59

今回FlaskとFlask-SQLAlchemmyとSQLite3を使ってデータを六つほど格納したDBを作ろうとしましたが、始めからデータを与えられた状態のdbを作るやり方が分からず二日ほど苦戦しています
#試したこと
ならばデータが空の状態でのdb(ramen_suki.db、モデル名はShop,テーブル名はshops)を作り、後から操作して目的のデータを入れ込もうと思い何とかramen_suki.dbまでの作成には至れたものの、

>>> enter = Shop('ラーメン', '11', '15', '17', '21', '11', '15','こってり') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: __init__() takes 1 positional argument but 9 were given (コマンドプロンプト上のpythonモードで行いました・pipenvの仮想環境下で作業しています))

と設定した覚えのない_init_()の位置引数の関係で何故かエラーが出てしまいました(モデル定義の時に_init_()を定義することもあるそうですが、そのことでしょうか・・・私は定義しませんでした。それを使えばデータがは入った状態でdb作成ができたのかもしれませんが、いくら調べても目的の情報が見つからなかったので諦めました)

最期に
SALAlchemyの初期設定を行った_init_.pyとconfig.py,モデルの定義を行ったshops.pyとデータベースへの反映に使ったスクリプトファイルdb.py,それを実行するために書いたmanage.pyを下に載せておきます
よろしくお願いいたします

python

1#ramen_suki/_init_.py 2from flask import Flask 3from flask_sqlalchemy import SQLAlchemy 4 5app = Flask(__name__) 6app.config.from_object("ramen_suki.config") 7 8db = SQLAlchemy(app) 9 10 11import ramen_suki.views

python

1#ramen_suki/config.py 2DEBUG=True 3SQLALCHEMY_DATABASE_URI = 'sqlite:///ramen_suki.db' 4SQLALCHEMY_TRACK_MODIFICATIONS = True 5SECRET_KEY='\xe0KZ\xf8\x0f=\xa6<V\x07d\x8d\x9dv\xe6\x1f\x884\xe8\xdaX\x83v\xd9' 6

python

1#remen_suki/models/shops.py 2from ramen_suki import db 3 4 5class Shop(db.Model): 6 7 __tablename__ = 'shops' 8 9 id = db.Column(db.Integer, primary_key=True) 10 11 name = db.Column(db.String(50), unique=True) 12 13 mo_open = db.Column(db.Integer) 14 15 mo_close = db.Column(db.Integer) 16 17 af_open = db.Column(db.Integer) 18 19 af_close = db.Column(db.Integer) 20 21 mid_open = db.Column(db.Integer) 22 23 mid_close = db.Column(db.Integer) 24 25 explanation = db.Column(db.Text) 26

python

1#ramen_suki/scripts/db.py 2from flask_script import Command 3 4from ramen_suki import db 5 6 7 8 9 10class InitDB(Command): 11 12 "create database" 13 14 15 16 def run(self): 17 18 db.create_all() 19 20

python

1#ramen_suki/manage.py 2from flask_script import Manager 3 4from ramen_suki import app 5 6 7 8from ramen_suki.scripts.db import InitDB 9 10 11 12 13 14if __name__ == "__main__": 15 16 manager = Manager(app) 17 18 manager.add_command('init_db', InitDB()) 19 20 manager.run() 21

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

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

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

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

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

quickquip

2019/09/04 13:27

ramen_suki.db の実体の部分のコードが要りそうです
coco53

2019/09/04 15:34

反応ありがとうございます 実体部分のコードらしきものを探してみたのですが、ramen_suki.dbのファイルを開いても何も書かれておらず、コマンドプロンプトでramen_suki.dbを開こうとしたのですが C:\Users\mori2\Downloads\sqlite3\sqlite3>sqlite3 SQLite version 3.29.0 2019-07-10 17:32:03 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite> .open ramen_suki.db sqlite> tables ...>.tables と以上のように表示されそもそも上手く作成できたのかすら分からない状況です 知識不足ですのでquiquiさんが仰った用語の意味を誤解しているかもしれません・・・ また、他にも何か既にデータが入った状態でdbを作成する方法やdbにデータを追加する代替案があればご教示いただければ幸いです・・
quickquip

2019/09/04 22:02 編集

Shopの上位クラス(正確にはここではメタクラス)に指定しているramen_suki.db.Modelの正体が知りたかったのです。それを宣言しているファイルの位置はコードからは分からないので「実体の部分のコード」と書きました。 知りたいのはPythonのコードです。
coco53

2019/09/05 07:56

「ゼロからFlaskがよく分かる本」やこちらのチュートリアル(https://study-flask.readthedocs.io/ja/latest/02.html)を参考にdb作成を行ったのですが、いずれもShopクラスの基底クラスであろうdb.Modelの正体には言及しておらず(どこかで定義したようにも見えなかった)、恥ずかしながらquiquiさんが望まれるコードを提供できそうにありません しかし調べてみてこちらのページ(https://www.atmarkit.co.jp/ait/articles/1808/07/news029.html)に「Flask-SQLAlchemyでは、上で作成したdbオブジェクトが持つメンバ「Model」の派生クラスとして、モデルを定義できる。」とあるので _init_.pyに書いた以下のコードと ``` from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config.from_object("ramen_suki.config") db = SQLAlchemy(app) import ramen_suki.views ``` config.pyに書いた以下のコードが手がかりになるでしょうか ``` DEBUG=True SQLALCHEMY_DATABASE_URI = 'sqlite:///ramen_suki.db' SQLALCHEMY_TRACK_MODIFICATIONS = True ``` 理解が浅く申し訳ありません
quickquip

2019/09/05 08:06 編集

情報は質問に追記しましょう。 状況は分かりました。こちらは、SQLAlchemmyを使っているコードでなくて、Flask-SQLAlchemyを利用したコードということになりますね。
coco53

2019/09/05 08:23 編集

ご指摘ありがとうございますその通りです 質問の前提から誤って伝えてしまい申し訳ありませんでした
quickquip

2019/09/05 13:13

間違っている箇所は正直見当たらないのですが、すみません、2点いいでしょうか。 エラーが出た状況を教えてもらえますか? flask shell とかすると対話環境に入るのでしょうか? それともpythonコマンドで普通の対話環境に入って(例えば) from remen_suki.models.shops import Shop とでもしましたか? remen_suki/models/shops.py がロードされている箇所が見当たりませんがviews.pyあたりに書いてありますか?
coco53

2019/09/05 14:00 編集

①以下が当日のコマンドプロンプト上のコードになります  pythonの対話環境で行っています(追記:pipenvの仮想環境下で作業しています) (application-MHQjNWhB) C:\Users\mori2\OneDrive\デスクトップ\application>python Python 3.7.4 (tags/v3.7.4:e09359112e, Jul 8 2019, 19:29:22) [MSC v.1916 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from ramen_suki.models.shops import Shop, db >>> Shop.query.all <bound method Query.all of <flask_sqlalchemy.BaseQuery object at 0x06000B30>> >>> enter = Shop('ラーメン', '11', '15', '17', '21', '11', '15','こってり') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: __init__() takes 1 positional argument but 9 were given ②ロード、というとimportという理解でよろしいでしょうか 以下が少し後ろは省略しましたがviews.pyの内容になります ``` from flask import request, redirect, url_for, render_template, flash, session from ramen_suki import app, db from ramen_suki.models.shops import Shop import random import datetime @app.route("/") def show_entries(): return render_template("first.html") @app.route("/get") def get_shop(): candidate = db.session.query(Shop).filter(Shop.id==1) return render_template("second.html", candidate=candidate) ``` 正直flask_sqlalchemyでのdbの扱いは調べるほどに様々なやり方があって混乱していました(知識不足故にそう見えるだけかもしれません) 作成方法やその後のデータの追加方法などです 書籍と公式・非公式のチュートリアルやその他サイトを見比べやってきましたがどれも微妙に異なっているように見えます 確信をもって参照できるものが見当たらないまま打ち込んだため、今となってはコマンドプロンプトで打ち込んだ内容がやはり間違っていたのだろうかと思ってしまいます
guest

回答1

0

ベストアンサー

Mapping imposes no restrictions or requirements on the constructor (__init__) method for the class.

https://docs.sqlalchemy.org/en/13/orm/constructors.html

すごい勘違いしてました!
SQLAlchemyは特に__init__を作らないです!

https://github.com/zzzeek/sqlalchemy/blob/rel_1_3_8/lib/sqlalchemy/ext/declarative/base.py#L826
**kwargsが渡されるだけなので、初期化は必ずキーワード引数付きでおこないます。

python

1Shop(name='ラーメン', mo_open=11, mo_close=15, af_open=17, af_close=21, mid_open=11, mid_close=15, explanation='こってり')

としないといけません。

投稿2019/09/06 07:30

quickquip

総合スコア11038

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

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

coco53

2019/09/07 05:27

ありがとうございました 今度こそ上手くdbを作れるよう再度挑戦してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問