処理したい .csv ファイルのセットがあります。SQL クエリで処理する方がはるかに簡単です。.csv ファイルをロードし、SQL 言語を使用して Python や Ruby などのスクリプト言語で調べる方法があるかどうか疑問に思っています。ActiveRecord に似たものでロードできれば素晴らしいと思います。
問題は、スクリプトを実行する前にどこかでデータベースを実行したくないということです。スクリプト言語といくつかのモジュール以外に追加のインストールは必要ありません。
私の質問は、このタスクにはどの言語とどのモジュールを使用すればよいかということです。いろいろ調べてみましたが、私のニーズに合うものが見つかりません。そもそも可能なのでしょうか?
ベストアンサー1
そこにはsqlite3
はPythonに含まれています。これを使ってデータベースを作成できます(記憶について) を作成し、そこに行を追加して、SQL クエリを実行します。
ActiveRecordのような機能が必要な場合は、次のような外部ORMを追加する必要があります。sqlalchemyただし、これは別途ダウンロードする必要があります
sqlalchemy を使用した簡単な例:
from sqlalchemy import create_engine, Column, String, Integer, MetaData, Table
from sqlalchemy.orm import mapper, create_session
import csv
CSV_FILE = 'foo.csv'
engine = create_engine('sqlite://') # memory-only database
table = None
metadata = MetaData(bind=engine)
with open(CSV_FILE) as f:
# assume first line is header
cf = csv.DictReader(f, delimiter=',')
for row in cf:
if table is None:
# create the table
table = Table('foo', metadata,
Column('id', Integer, primary_key=True),
*(Column(rowname, String()) for rowname in row.keys()))
table.create()
# insert data into the table
table.insert().values(**row).execute()
class CsvTable(object): pass
mapper(CsvTable, table)
session = create_session(bind=engine, autocommit=False, autoflush=True)
これで、データベースをクエリしたり、任意のフィールドでフィルタリングしたりできるようになりました。
この csv に対して上記のコードを実行するとします。
name,age,nickname
nosklo,32,nosklo
Afila Tun,32,afilatun
Foo Bar,33,baz
name
これにより、フィールド、age
、を含むテーブルがメモリ内に作成され、入力されますnickname
。その後、テーブルをクエリできます。
for r in session.query(CsvTable).filter(CsvTable.age == '32'):
print r.name, r.age, r.nickname
これにより、クエリが自動的に作成および実行されSELECT
、正しい行が返されます。
sqlalchemy を使用するもう 1 つの利点は、将来的に別のより強力なデータベースを使用することに決めた場合、実質的にコードを変更せずにそれを実行できることです。