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

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

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

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

SQLite

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

Python 3.x

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

Q&A

解決済

1回答

1039閲覧

Flask 他のテーブルへのデーター追加(登録)について

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

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

SQLite

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

Python 3.x

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

0グッド

1クリップ

投稿2023/01/21 07:28

編集2023/01/22 06:17

FlaskでIPアドレス管理台帳アプリを作成中です。
登録されたIPアドレスを削除する前に、未使用のIPアドレスを保存しているテーブル(freeipテーブル)へ
追加した後に、削除を実行したいのですが、この処理をどの様にすればよいのか分からない状態です。

具体的には、以下の部分です。

ご教示の程、よろしくお願い致します。

python

1# app.py抜粋 2 3@app.route('/delete/<int:id>') 4def delete(id): 5 6 # ipredgeテーブル内の削除対象idを取得 7 ipredg = Ipredg.query.get(id) 8 9 # ipredgeテーブルから削除データをfreeipテーブルに登録するため、それぞれのデーターを取得しておく 10 ipredg.ip = request.get('ip') 11 ipredg.mac = request.get('mac') 12 ipredg.hostname = request.get('hostname') 13 ipredg.remark = request.get('remark') 14 15 # ipredgeテーブルから削除したデーターをfreeipテーブルへ登録 16 # ここから、freeipテーブルに、どうやって追加すれば良いのか? 17 db.session.add() 18 19 # ipreddgeテーブルから、削除ボタンを押したデーターを削除 20 db.session.delete(ipredg) 21 db.session.commit() 22 return redirect('/') 23

python

1# app.py 2 3from datetime import datetime 4 5from flask import Flask, render_template, request, redirect, url_for 6from flask_sqlalchemy import SQLAlchemy 7import os 8 9 10app = Flask(__name__) 11key = os.urandom(21) 12app.secret_key = key 13 14app.config['SECRET_KEY'] = 'mysecretkey' 15URI = 'sqlite:///ip.db' 16app.config['SQLALCHEMY_DATABASE_URI'] = URI 17app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 18db = SQLAlchemy(app) 19 20 21from sqlalchemy.engine import Engine 22from sqlalchemy import event 23 24@event.listens_for(Engine, "connect") 25def set_sqlite_pragma(dbapi_connection, connection_record): 26 cursor = dbapi_connection.cursor() 27 cursor.execute("PRAGMA foreign_keys=ON") 28 cursor.close() 29 30 31class Ipredg(db.Model): 32 __tablename__='ipreg' 33 id = db.Column(db.Integer, primary_key=True) 34 ip = db.Column(db.String(20)) 35 mac = db.Column(db.String(20)) 36 hostname = db.Column(db.String(50)) 37 remark = db.Column(db.String(50)) 38 39 def __init__(self, ip, mac, hostname, remark): 40 self.ip = ip 41 self.mac = mac 42 self.hostname = hostname 43 self.remark = remark 44 45 46class Freeip(db.Model): 47 __tablename__='freeip' 48 f_id = db.Column(db.Integer, primary_key=True) 49 f_ip = db.Column(db.String(20)) 50 f_mac = db.Column(db.String(20)) 51 f_hostname = db.Column(db.String(50)) 52 f_remark = db.Column(db.String(50)) 53 54 def __init__(self, f_ip, f_mac, f_hostname, f_remark): 55 self.f_ip = f_ip 56 self.f_mac = f_mac 57 self.f_hostname = f_hostname 58 self.f_remark = f_remark 59 60 61@app.cli.command('initialize_DB') 62def initialize_DB(): 63 db.create_all() 64 65@app.route('/') 66def index(): 67 ipredg = Ipredg.query.all() 68 return render_template('index.html', ipredg=ipredg) 69 70@app.route('/free') 71def free(): 72 free_ip = Freeip.query.all() 73 return render_template('freeip.html', free_ip=free_ip) 74 75@app.route('/delete/<int:id>') 76def delete(id): 77 78 # ipredgeテーブル内の削除対象idを取得 79 ipredg = Ipredg.query.get(id) 80 81 # ipredgeテーブルから削除データをfreeipテーブルに登録するため、それぞれのデーターを取得しておく 82 ipredg.ip = request.get('ip') 83 ipredg.mac = request.get('mac') 84 ipredg.hostname = request.get('hostname') 85 ipredg.remark = request.get('remark') 86 87 # ipredgeテーブルから削除したデーターをfreeipテーブルへ登録 88 # ここから、freeipテーブルに、どうやって追加すれば良いのか? 89 db.session.add() 90 91 # ipreddgeテーブルから、削除ボタンを押したデーターを削除 92 db.session.delete(ipredg) 93 db.session.commit() 94 return redirect('/') 95 96 97if __name__ == '__main__': 98 app.run(debug=True) 99

html

1<!-- index.html --> 2{% extends 'base.html' %} 3 4{% block content %} 5<h1>登録一覧画面</h1> 6<table class="table table-striped"> 7 <tr> 8 <th>#</th> 9 <th>IP Address</th> 10 <th>Mac Address</th> 11 <th>Hostname</th> 12 <th>備考</th> 13 </tr> 14 {% for list in ipredg %} 15 <tr> 16 <td> 17 <a href="update/{{list.id}}" role="button">更新</a> 18 <a href="delete/{{list.id}}" role="button">削除</a> 19 </td> 20 <td>{{list.ip}}</td> 21 <td>{{list.mac}}</td> 22 <td>{{list.hostname}}</td> 23 <td>{{list.remark}}</td> 24 </tr> 25 {% endfor %} 26 27</table> 28 29{% endblock %} 30

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージの掲載もなく、何もかもわからないという質問は、以下にある「コードをください・デバッグしてください等の丸投げの質問」にあたり、回答が付かない可能性が高いです。

https://teratail.com/help/avoid-asking

質問するときは、どのような事をしたくて、どのようなことを実行して、どのような問題があり、どのような解決策を図ったが、結局どうなったのか、といった情報が必要です。
解決策については、「ググりました」だと、回答者が同じことをして時間が無駄になる可能性があるので、具体的にどのような物を見て実行して、どうだったのかというのを記載下さい。

これだけだと微妙なので、一応回答も記載します。

まず、以下がInsert/Update/Deleteのドキュメントです。
https://flask-sqlalchemy.palletsprojects.com/en/3.0.x/queries/

これによると、

python

1db.session.delete(user) 2db.session.commit()

とありますので、以下で削除できるはずです。

python

1ipredg = Ipredg.query.get(id) 2db.session.delete(ipredg) 3db.session.commit()

Ipredg.query.get(id)にヒットしない場合、戻り値はNoneになるはずなので、Noneの場合は処理しないとか、id指定が間違っているとかのエラー処理を入れた方が良いでしょう。

以下の部分は何がしたいのか不明です。
それぞれのデーターを取得しておく、と書いてありますが、既にidで取得済みのデータが入っているところに、Webからの入力値で上書きを実施しています。
updateするなら意味が分かりますが、削除にしか使っていないものを上書きする意味は無いはずです。

python

1 # ipredgeテーブルから削除データをfreeipテーブルに登録するため、それぞれのデーターを取得しておく 2 ipredg.ip = request.get('ip') 3 ipredg.mac = request.get('mac') 4 ipredg.hostname = request.get('hostname') 5 ipredg.remark = request.get('remark')

で、肝心の質問っぽいところ以下についてです。

python

1 # ipredgeテーブルから削除したデーターをfreeipテーブルへ登録 2 # ここから、freeipテーブルに、どうやって追加すれば良いのか? 3 db.session.add()

この質問が書いてある理由が理解できません。
ご自身の1つ前の質問で、add.pyというものを提示されていましたよね?

以下がその抜粋です。

python

1free_ip_list = [] 2for i in range(100, 111): 3 free_ip_list.append(freeip(f"192.168.1.{i}", f"00:{i}:aa:cc:dd", f"host{i}", f"備考{i}")) 4 5db.session.add_all(free_ip_list) 6db.session.commit()

これがfreeipの追加コードなのはわかりますか?
自分で書いたのだから分かると信じていますが、これをは複数を追加していますので、1つだけ追加するように変えれば良いだけです。
add_allではなくaddですね。

freeipの引数には、request.getで取得した値を指定すれば良いでしょう。

わからない事があればコメントをお願いします。

2023/01/23 追記

自分が書いたコード内でやっていると思いますが、自分の書いたコードが分からないということですか?

前の質問では、class freeip(db.Model):と書かれていましたが、現在のコードではclass Freeip(db.Model):と、最初の人文字が大文字になっているので、

python

1myip = Freeip("ipaddress", "mac address", "host", "備考")

のようにClassを作って、

python

1db.session.add(myip) 2db.session.commit()

として実行すれば追加されると思いますが、何か別の事をやろうとしていますか?

それとも、上の例で書いた("ipaddress", "mac address", "host", "備考")の文字列部分に何を入れれば良いか分からないということでしょうか?

IpredgとFreeipが何を表しているのか不明ですが、Ipredgから削除した物と同じものをFreeipに登録したいというのでしたら、

python

1ipredg = Ipredg.query.get(id)

として取得したipredgの内容を、全部自分でコピーして使えば良いと思います。
例えば、

python

1myip = Freeip(ipredg.ip, ipredg.mac, ipredg.hostname, ipredg.remark) 2db.session.add(myip) 3db.session.commit()

投稿2023/01/23 00:45

編集2023/01/23 07:44
FiroProchainezo

総合スコア2401

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

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

退会済みユーザー

退会済みユーザー

2023/01/23 06:57

def delete(id):の処理内で、選択したidのデーターをfreeipテーブルへ登録し、ipregテーブルから削除を行いたいということです。ipregテーブルから選択したデーターを削除することは、できているのですが、def delete(id):内でどうやって、freeipのインスタンスを呼び出し、freeipテーブルへ登録しする処理を記載すればいいのかが分からない状況です。
退会済みユーザー

退会済みユーザー

2023/01/24 12:14

FiroProchaainezoさん 色々言葉足らずで申し訳ありませんでした。また、色々と記載いただきありがとうございます。行いたい処理としては、「ipredgから削除した物と同じものをFreeipに登録したいとい」ということです。ご提示いただきましたコードで実現できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問