数据库与脚本语言 [英] Database on the fly with scripting languages

查看:131
本文介绍了数据库与脚本语言的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一组.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆