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

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

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

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

SQLAlchemy

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

Python

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

Q&A

解決済

4回答

13529閲覧

SQLAlchemyなどのORMエンジンを使う意味

lazuline8

総合スコア48

ORM

ORM(オブジェクト関係マッピング)はオブジェクト指向のシステムとリレーショナルデータベースの間でマッピングを行う技術です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

SQLAlchemy

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

Python

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

0グッド

1クリップ

投稿2018/10/05 09:33

Pythonを使ってRedshiftのデータを加工、分析、表示するコードを書いています。
DBから取得したデータをpandasのDataFrameに入れていろいろと触る方針です。
PythonからRedshiftに接続する方法を調べていて、psycopg2を使って接続、SQLを実行する方法は確立したのですが、SQLAlchemyをかませてcreate_engineしてから接続する方法を紹介しているところが非常に多く、混乱しています。
psycopg2を使って直接接続すれば

python

1import pandas as pd 2import psycopg2 as pg2 3 4con= pg2.connect(host=server,database=db,port=dbport,user=username,password=userpass) as con: 5df=pd.read_sql(query,con) 6con.close()

のようなコードで済むところを、

python

1from sqlalchemy create_engine 2import pandas as pd 3import numpy as np 4import psycopg2 as pg2 5 6db_conf='postgresql+psycopg2://{user}:{passwd}@{host}:{port}/{dbname}'.format( 7 user=username,passwd=userpass,host=server,port=dbport,dbname=db) 8engine=create_engine(db_conf) 9con=engine.connect() 10data=pd.read_sql(q,engine) 11con.close() 12engine.dispose()

上記のように一度SQLAlchemyでエンジンを作ってデータを取る方法を紹介しているのですが、変数も増えるしコードも長くなるしいいことがないように思えてなりません。

わざわざコードを冗長にしているからには相応の理由があると思うのですが、pythonスクリプトからSQLAlchemyを一度はさんでSQLに接続するメリット、使わなかった場合のデメリットとはなんでしょうか?

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

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

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

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

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

guest

回答4

0

ベストアンサー

メリット : Pythonのコードの中にSQLを記述しないで済む。
デメリット : SQLAlchemyに熟練している人が少ない。SQLAlchemyを通すと複雑なSQLになる場合、SQLを覚えておいた方がパフォーマンスが良い場合が多そう。

わたしはOracleのパフォーマンス・チューニングで呼ばれることが多いですが、SELECT文のJOINさえ知らないとか、PARALLELヒントも知らないなどSQL入門レベルの知識の人たちだけで書いたコードで非効率なSQLになっていることが多いです。最初からOracle SQL, PL/SQLの熟練者をひとりでも入れてパフォーマンス面のチェックをさせたら、何千万円、何億円単位で無駄な費用を削れることが少なくないです。

投稿2018/10/05 10:10

Orlofsky

総合スコア16417

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

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

0

Redshiftのデータを加工、分析、表示するコードを書いています。

DBから取得したデータをpandasのDataFrameに入れていろいろと触る方針です。

このような用途の場合、ORMはあまり役に立ちません

ORMが効果を発揮するのは、「CRUD」と呼ばれるような、Webシステムで1件のデータとそれに紐づくリレーションのデータを操作する、というような場面です。高度なSQLを書いての集計や、逆にただデータを取ってくるだけの場合は、ORMである意味はあまりありません。

投稿2018/10/05 10:39

maisumakun

総合スコア145939

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

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

0

メリット以前に、psycopg2のコネクションを渡してちゃんと動くんですか?

con : SQLAlchemy connectable (engine/connection) or database string URI or DBAPI2 connection (fallback mode)

Using SQLAlchemy makes it possible to use any DB supported by that library. If a DBAPI2 object, only sqlite3 is supported.

pandas.read_sql — pandas 0.23.4 documentation

SQLAlchemyを使う、URIを文字列で渡す、sqlite3のコネクションを使う、以外の選択肢はないように読めるのですが。

投稿2018/10/05 14:13

hayataka2049

総合スコア30935

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

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

0

pandasで使う場合は、sqlalchemyを使ってもコードは長くはならないです。以下のコードで動きます。engineをdisposeする必要があるかどうかは議論があるところですが、コマンドラインで使う場合であればdisposeしなくも問題になることは少ないと思います。

python

1from sqlalchemy import create_engine 2import pandas as pd 3 4engine = create_engine('postgresql://user:passwd@host:5432/dbname') 5df = pd.read_sql(q, con=engine)

SQLAlchemyをかませておくメッリトは、データベースを例えばPostgreSQLからMySQLに変えた時にコードの修正が少ないことです。SQLAlchemyを使うことをおすすめします。

https://www.programcreek.com/python/example/101381/pandas.read_sql

投稿2018/10/05 10:58

編集2018/10/05 12:55
YasuhiroNiji

総合スコア584

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問