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

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

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

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

SQLite

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

SQLAlchemy

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

Python

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

受付中

flask + sqlalchemyでクエリストリングスの値をもとにDBデータをUPDATEしたい

cartocchi_0609
cartocchi_0609

総合スコア0

Flask

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

SQLite

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

SQLAlchemy

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

Python

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

1回答

0評価

0クリップ

268閲覧

投稿2022/04/05 14:39

編集2022/04/09 20:19

プログラミング初心者です。Flaskとsqlalchemyを用いて会社の貸出物品の管理アプリを作ろうと試みています。

実現したいこと

社員が貸出物品を持ち出した記録をDB上に記録
・物品ごとにクエリパラメータを振り、QRコード化
・社員はQRコードをスマホで撮影→持ち出し先と社員名をプルダウン選択し更新ボタンを押下するとDB上の当該データがそれに書き換わる。

・その他の社員が現時点の物品の在庫・所在をアプリ上で確認できる
という状態を目指しています。

app.py

from flask import Flask,render_template,request,url_for,redirect from models.models import SuitoContent from models.database import db_session from datetime import datetime app = Flask(__name__) @app.route("/") @app.route("/index") def index(): name = request.args.get("name") num = request.args.get("num") all_suito = SuitoContent.query.all() return render_template("index.html", name=name, num=num, all_suito=all_suito) @app.route("/update",methods=['GET','POST']) def update(): id = request.args.get("id") suito = db_session.query(SuitoContent).filter(SuitoContent.id == id).first() print(suito.date,suito.place,suito.member) suito.date = datetime.now() suito.place = request.form.get("place") suito.member = request.form.get("member") db_session.commit() return redirect(url_for("index")) if __name__ == "__main__": app.run(debug=True)

models.py

from sqlalchemy import Column, Integer, Text, DateTime from models.database import Base from datetime import datetime class SuitoContent(Base): __tablename__ = 'suitocontents' id = Column(Integer, primary_key=True) code = Column(Text) #物品の製品番号 num = Column(Integer, unique=True) #物品の管理番号 name = Column(Text) #物品の製品名 place = Column(Text) #所在 date = Column(DateTime, default=datetime.now()) member = Column(Text) #最後に動かした社員名 def __init__(self, code=None, num=None, name=None, place=None, date=None, member=None): self.code = code self.num = num self.name = name self.place = place self.date = date self.member = member

database.py

from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker from sqlalchemy.ext.declarative import declarative_base import os databese_file = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'suito.db') engine = create_engine('sqlite:///' + databese_file, convert_unicode=True, connect_args={"check_same_thread": False}) db_session = scoped_session(sessionmaker(autocommit=False,autoflush=False,bind=engine)) Base = declarative_base() Base.query = db_session.query_property() def init_db(): import models.models Base.metadata.create_all(bind=engine)

index.html

<!DOCTYPE html> <html> <head> <title>在庫確認表</title> </head> <body> <h1>在庫確認表</h1> {% if num == None %} <h3>現在の在庫状況は下記です。</h3> {% else %} <hr style="border: #ff9900 solid 5px;"> <img src="/static/images/{{num}}.png" alt="画像"> <h3>{{num}}番 {{name}}の在庫情報を変更します。</h3> <form action="/update" method="post"> <select name="place"> <option hidden>持ち出し先</option> <option value="営業所">営業所</option> <option value="物品1">物品1</option> <option value="物品2">物品2</option> <option value="物品3">物品3</option> <option value="物品4">物品4</option> <option value="物品5">物品5</option> </select> <select name="member"> <option hidden>名前</option> <option value="社員A">社員A</option> <option value="社員B">社員B</option> <option value="社員C">社員C</option> <option value="社員D">社員D</option> <option value="社員E">社員E</option> </select> <input type="submit" name="update" value="更新"> </form> <hr style="border: #ff9900 solid 5px;"> {% endif %} {% for suito in all_suito %} <table> <tbody> <tr> <td align="center" valign="middle" width="130" style="border: #ff9900 solid 1px; font-size: 100%; padding: 10px;"> <img src="/static/images/{{suito.num}}.png"></td> <td width="400" style="border: #ff9900 solid 1px; font-size: 100%; padding: 10px;"> 品名:{{suito.name}} <br>品番:{{suito.code}} | 管理番号:{{suito.num}} <br>所在:{{suito.place}} | 最終更新者:{{suito.member}} <br>最終更新日{{suito.date}} </td> </tr> </tbody> </table> {% endfor %} </body> </html>
#QRコード化を想定しているクエリパラメータ例 http://127.0.0.1:5000/index?id=1&num=(管理番号)&name=(製品名)

error

def update(): Open an interactive python shell in this frame id = request.args.get("id") suito = db_session.query(SuitoContent).filter(SuitoContent.id == id).first() suito.place = request.form.get("place") suito.member = request.form.get("member") suito.date = datetime.now() db_session.commit() AttributeError: 'NoneType' object has no attribute 'place'

cmd

sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread. The object was created in thread id 24704 and this is thread id 28128.

調べたところ、スレッド間でのコネクションの使いまわしができないなどと目にしたため、理解できないなりに、

database.py

engine = create_engine('sqlite:///' + databese_file, convert_unicode=True, connect_args={"check_same_thread": False})

などとしてみましたが、状況は変わらずでした。

なんとか前進させたく、お知恵をお貸しいただけないでしょうか。
よろしくお願い申しげます。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Flask

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

SQLite

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

SQLAlchemy

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

Python

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