にSQLクエリの結果を回します。これは、permissionsテーブルとmany-to-manyリレーションシップとaddressesテーブルとの多対多リレーションシップを持つユーザーテーブルです。この不自然な例ではそうは、私は(擬似コードで)このようになりますのPostgresのデータベーススキーマを持つコンパクトなPythonのフォーム
results = [
{'pk': 1, 'name': 'Joe', 'permission': 'user', 'address': 'home'},
{'pk': 1, 'name': 'Joe', 'permission': 'user', 'address': 'work'},
{'pk': 1, 'name': 'Joe', 'permission': 'admin', 'address': 'home'},
{'pk': 1, 'name': 'Joe', 'permission': 'admin', 'address': 'work'},
{'pk': 2, 'name': 'John', 'permission': 'user', 'address': 'home'},
]
:
Pythonで私は正しいSQLAlchemyのクエリの呪文を実行すると、私は(Pythonで辞書のリストに変換した後に)このような何かを見て、結果を取り戻します、Joeはユーザーと管理者の両方です。ジョンはユーザーだけです。ジョーの自宅住所と仕事住所の両方がデータベースに存在します。ジョンの自宅の住所だけが存在します。
質問は、これらのSQLクエリの 'results'から下のよりコンパクトな 'desired_results'に行く最良の方法を知っている人はいますか?
desired_results = [
{
'pk': 1,
'name': 'Joe',
'permissions': ['user', 'admin'],
'addresses': ['home', 'work']
},
{
'pk': 2,
'name': 'John',
'permissions': ['user'],
'addresses': ['home']
},
]
必要な追加情報:私は多対多の関係を持っている各フィールドのdesired_resultsで使用したいのラベル」を記述した辞書の小さなリスト。
relationships = [
{'label': 'permissions', 'back_populates': 'permission'},
{'label': 'addresses', 'back_populates': 'address'},
]
最終的な考慮事項は、私はこの質問の目的のために一緒に具体例を入れているが、一般的に、私は関係の任意の量を想定し、一般的にSQLデータベースを照会の問題を解決しようとしています。 SQLAlchemy ORMはこの問題をうまく解決しますが、私はSQLAlchemy Coreを使用することに限られています。私自身のソリューションを構築しようとしています。
アップデートはここで答えですが、私はそれが最高の/最も効率的なソリューションだか分かりません。誰かが何か良いものを考え出すことができますか?
# step 1: generate set of keys that will be replaced by new keys in desired_result
back_populates = set(rel['back_populates'] for rel in relationships)
# step 2: delete from results keys generated in step 1
intermediate_results = [
{k: v for k, v in res.items() if k not in back_populates}
for res in results]
# step 3: eliminate duplicates
intermediate_results = [
dict(t)
for t in set([tuple(ires.items())
for ires in intermediate_results])]
# step 4: add back information from deleted fields but in desired form
for ires in intermediate_results:
for rel in relationships:
ires[rel['label']] = set([
res[rel['back_populates']]
for res in results
if res['pk'] == ires['pk']])
# done
desired_results = intermediate_results
「リレーションシップ」リストを使用して希望の結果を得ることは何ですか? – AlokThakur
あなたにコードを教えてください。 'relationships'と' results'リストについては何を仮定できますか?そして、それらは完全に正規であると仮定し、すべてのフィールドが表示されていると仮定できますか? –
彼らは完全に規則的です。すべてのフィールドが表示されます。 – bcmyers