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

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

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

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

SQLAlchemy

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

Q&A

解決済

2回答

3517閲覧

flask(SQLAlchemy) リスト型としてデータベース登録する方法

sandalwalk

総合スコア77

Python 3.x

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

SQLAlchemy

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

0グッド

0クリップ

投稿2020/07/16 04:38

編集2020/07/16 05:04

flask+sqlalchemy(posgtresql)を使い、国の名前と、各国に対して複数の都市の名前を登録するデータベースを作成しています。国の名前は一つなので、db.Text()の方法で問題無く利用できていますが、都市名は複数(数は不定)で、リスト形式で与えられます。(例、['New York', 'San Francisco', 'Chicago', 'Seattle']
現在は以下の様にText()の方法で登録し、結果を利用する際はstrip等を使って再度リスト型に変換していますが、cities = db.Column(db.Text())としている部分で、最初から与えれる上記のリスト型の都市のリストが入力できる様にするにはどうすれば良いでしょうか。

python

1app = Flask(__name__) 2 3app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/testdb' 4db = SQLAlchemy(app) 5 6class City(db.Model): 7 __tablename__ = 'country_city' 8 9 id = db.Column(db.Integer, primary_key=True, autoincrement=True) 10 country = db.Column(db.Text()) 11 cities = db.Column(db.Text())

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

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

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

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

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

quickquip

2020/07/16 04:49

Flaskは全然関係ないのでタグを消して、かわりに SQLAlchemy のタグを入れた方がよいかと思いました
guest

回答2

0

SQLAlchemy触ったことありませんが、一(国)対多(都市)の関係を持たせてはいかがでしょうか。
参考:Flask-SQLAlchemy 一対多のリレーション

om.py

Python

1from flask import Flask 2from flask_sqlalchemy import SQLAlchemy 3 4app = Flask(__name__) 5app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db' 6db = SQLAlchemy(app) 7 8# 国 9class Country(db.Model): 10 id = db.Column(db.Integer, primary_key=True) 11 name = db.Column(db.String(20)) 12 cities = db.relationship('City', backref='owner') 13 14# 都市 15class City(db.Model): 16 id = db.Column(db.Integer, primary_key=True) 17 name = db.Column(db.String(20)) 18 owner_id = db.Column(db.Integer, db.ForeignKey('country.id'))

main.py

Python

1from om import db, Country, City 2 3# DB作成 4db.create_all() 5 6# 日本を追加 7cn = Country(name="Japan") 8db.session.add(cn) 9db.session.commit() 10 11# 東京を追加 12ct = City(name="Tokyo", owner=cn) 13db.session.add(ct) 14db.session.commit() 15 16# 大阪を追加 17ct = City(name="Osaka", owner_id=cn.id) 18db.session.add(ct) 19db.session.commit() 20 21# 日本を探す 22cn = Country.query.filter_by(name="Japan").first() 23print(cn.name) # Japan 24print(cn.cities) # [<City 1>, <City 2>] 25 26# 大阪を探す 27ct = City.query.filter_by(name="Osaka").first() 28print(ct.name) # Osaka 29 30# 大阪の属する国を探す 31ct = Country.query.filter_by(id=ct.owner_id).first() 32print(ct.name) # Japan

投稿2020/07/16 05:08

can110

総合スコア38262

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

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

0

自己解決

SQLAlchemyのドキュメントを参考に解決しました。
https://docs.sqlalchemy.org/en/13/dialects/postgresql.html

python

1from sqlalchemy.dialects import postgresql 2 3cities = db.Column(pg.ARRAY(db.String, dimensions=1), nullable=True)

を使います。
最終的に以下のコードで動作しました。

python

1from flask import Flask, render_template 2from flask_sqlalchemy import SQLAlchemy 3from sqlalchemy.dialects import postgresql as pg 4 5app = Flask(__name__) 6 7app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://localhost/testdb' 8db = SQLAlchemy(app) 9 10 11class City(db.Model): 12 __tablename__ = 'city_list' 13 14 id = db.Column(db.Integer, primary_key=True, autoincrement=True) 15 country = db.Column(db.Text()) 16 cities = db.Column(pg.ARRAY(db.String, dimensions=1), nullable=True) 17

投稿2020/07/16 05:48

sandalwalk

総合スコア77

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問