数据库与脚本语言 [英] Database on the fly with scripting languages
问题描述
我有一组.csv文件,我想要处理。使用SQL查询处理它会更容易。我想知道是否有一些方法来加载.csv文件,并使用SQL语言来查看它与脚本语言像python或ruby。加载它类似于ActiveRecord将是真棒。
问题是我不想在运行我的脚本之前运行一个数据库。我不能在脚本语言和一些模块之外添加额外的安装。
我的问题是我应该使用哪个语言和什么模块来完成这个任务。我环顾四周,找不到适合我需要的东西。是否可能?
有 sqlite3
,包含在python中。使用它,你可以创建一个数据库(在内存),并添加行,并执行SQL查询。
如果你想要整洁的ActiveRecord-像功能一样,您应该添加外部ORM,如 sqlalchemy 。这是一个单独的下载
使用sqlalchemy的快速示例:
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://')#仅内存数据库
表=无
元数据= MetaData(bind =引擎)
打开(CSV_FILE)为f:
#假设第一行是头
cf = csv.DictReader(f,delimiter =',')
对于cf中的行:
如果表为None:
#表
table =表('foo',元数据,
列('id',Integer,primary_key = True),
* .keys()))
table.create()
#将数据插入表
table.insert()。values(** row).execute()
class CsvTable(object):pass
mapper(CsvTable,table)
session = create_session(bind = engine,autocommit = False,autoflush = True)
现在您可以查询数据库,通过任何字段过滤等。
运行上面的csv代码:
名称,年龄,昵称
nosklo,32,nosklo
Afila Tun,32,afilatun
Foo Bar,33,baz
内存中具有
名称
,年龄
,昵称
。然后,您可以在session.query(CsvTable).filter(CsvTable.age == '32)中查询表格:'):
print r.name,r.age,r.nickname
自动创建并运行
SELECT
查询并返回正确的行。
使用sqlalchemy的另一个优点是,如果您决定在未来使用另一个更强大的数据库,您可以在不更改代码的情况下这样做。
I have a set of .csv files that I want to process. It would be far easier to process it with SQL queries. I wonder if there is some way to load a .csv file and use SQL language to look into it with a scripting language like python or ruby. Loading it with something similar to ActiveRecord would be awesome.
The problem is that I don't want to have to run a database somewhere prior to running my script. I souldn't have additionnal installations needed outside of the scripting language and some modules.
My question is which language and what modules should I use for this task. I looked around and can't find anything that suits my need. Is it even possible?
解决方案There's
sqlite3
, included into python. With it you can create a database (on memory) and add rows to it, and perform SQL queries.If you want neat ActiveRecord-like functionality you should add an external ORM, like sqlalchemy. That's a separate download though
Quick example using 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)
Now you can query the database, filtering by any field, etc.
Suppose you run the code above on this csv:
name,age,nickname nosklo,32,nosklo Afila Tun,32,afilatun Foo Bar,33,baz
That will create and populate a table in memory with fields
name
,age
,nickname
. You can then query the table:for r in session.query(CsvTable).filter(CsvTable.age == '32'): print r.name, r.age, r.nickname
That will automatically create and run a
SELECT
query and return the correct rows.Another advantage of using sqlalchemy is that, if you decide to use another, more powerful database in the future, you can do so pratically without changing the code.
这篇关于数据库与脚本语言的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!