2010-06-01 18 views
17

से डंप सीएसवी किसी कारण से, मैं एक सीएसवी फ़ाइल के रूप में डेटाबेस (sqlite3) से एक टेबल डंप करना चाहता हूं। मैं डेटाबेस को संशोधित करने के लिए elixir (sqlalchemy पर आधारित) के साथ एक पायथन लिपि का उपयोग कर रहा हूँ। मैं सोच रहा था कि टेबल को डंप करने का कोई तरीका है जिसे मैं सीएसवी में उपयोग करता हूं।sqlalchemy

मैंने sqlalchemy serializer देखा है, लेकिन ऐसा लगता है कि मैं क्या चाहता हूं। क्या मैं इसे गलत कर रहा हूँ? क्या मुझे अपने sqlalchemy सत्र को बंद करने के बाद sqlite3 python module पर कॉल करना चाहिए? या मुझे घर का बना कुछ इस्तेमाल करना चाहिए?

उत्तर

20

वहाँ इस लक्ष्य को हासिल करने के लिए कई तरीके, sqlite3 उपयोगिता अगर आपको लगता है कि स्थापित किया है के लिए एक सरल os.system() कॉल भी शामिल है, लेकिन यहां मोटे तौर पर क्या मैं अजगर से करना चाहते हैं: यहाँ

import sqlite3 
import csv 

con = sqlite3.connect('mydatabase.db') 
outfile = open('mydump.csv', 'wb') 
outcsv = csv.writer(outfile) 

cursor = con.execute('select * from mytable') 

# dump column titles (optional) 
outcsv.writerow(x[0] for x in cursor.description) 
# dump rows 
outcsv.writerows(cursor.fetchall()) 

outfile.close() 
25

संशोधित पीटर हैनसेन का जवाब थोड़ा, कच्चे डाटाबेस का उपयोग करने के बजाय SQLAlchemy का उपयोग करने के

import csv 
outfile = open('mydump.csv', 'wb') 
outcsv = csv.writer(outfile) 
records = session.query(MyModel).all() 
[outcsv.writerow([getattr(curr, column.name) for column in MyTable.__mapper__.columns]) for curr in records] 
# or maybe use outcsv.writerows(records) 

outfile.close() 
+1

बस एक छोटा रिमा आरके: 'outcsv.writerows (रिकॉर्ड्स) 'के परिणामस्वरूप' त्रुटि: अनुक्रम अपेक्षित ' – miku

+1

भी आप' __mapper__' [विशेषता] (http://www.sqlalchemy.org/docs) का उपयोग कर एक ही समय में सभी कॉलम प्राप्त कर सकते हैं /orm/extensions/declarative.html#synopsis), इस प्रकार: '[outcsv.writerow ([getattr (curr, column.name) MyModel में कॉलम के लिए .__ mapper__।कॉलम]) रिकॉर्ड्स में कर्सर के लिए] ' – miku

+0

कॉलम का वर्णन करने के लिए प्रारंभिक हेडर पंक्ति जोड़ने के लिए, ' outcsv.writerow ([MyModel में कॉलम के लिए कॉलम.नाम .__ मैपर __। कॉलम]) ' – bschwagg

13

मैं इस तरह मेरी SQLAlchemy आधारित कोड के लिए ऊपर दिए गए उदाहरणों अनुकूलित:

import csv 
import sqlalchemy as sqAl 

metadata = sqAl.MetaData() 
engine = sqAl.create_engine('sqlite:///%s' % 'data.db') 
metadata.bind = engine 

mytable = sqAl.Table('sometable', metadata, autoload=True) 
db_connection = engine.connect() 

select = sqAl.sql.select([mytable]) 
result = db_connection.execute(select) 

fh = open('data.csv', 'wb') 
outcsv = csv.writer(fh) 

outcsv.writerow(result.keys()) 
outcsv.writerows(result) 

fh.close 

यह मेरे लिए sqlalchemy 0.7.9 के साथ काम करता है। मुझे लगता है कि यह सभी sqlalchemy तालिका और परिणाम वस्तुओं के साथ काम करेगा।

3
with open('dump.csv', 'wb') as f: 
    out = csv.writer(f) 
    out.writerow(['id', 'description']) 

    for item in session.query(Queue).all(): 
     out.writerow([item.id, item.description]) 

यदि आपको अपने कॉलम लेबलों को हाथ से तैयार करने में कोई फर्क नहीं पड़ता है तो मुझे यह उपयोगी लगता है।

+1

यह बहुत साफ है ऊपर जवाब। धन्यवाद! – Brodan

1
import csv 

f = open('ratings.csv', 'w') 
out = csv.writer(f) 
out.writerow(['id', 'user_id', 'movie_id', 'rating']) 

for item in db.query.all(): 
    out.writerow([item.username, item.username, item.movie_name, item.rating]) 
f.close() 
0

एक मॉड्यूलर तरीके से: एक उदाहरण automap और mysql के साथ slqalchemy का उपयोग कर एक उदाहरण।

database.py:

from sqlalchemy.ext.automap import automap_base 
from sqlalchemy.orm import Session 
from sqlalchemy import create_engine 

Base = automap_base() 

engine = create_engine('mysql://user:[email protected]:3306/database_name', echo=True) 

Base.prepare(engine, reflect=True) 

# Map the tables 
State = Base.classes.states 

session = Session(engine, autoflush=False) 

export_to_csv.py:

from databases import * 
import csv 

def export(): 

    q = session.query(State) 

    file = './data/states.csv' 

    with open(file, 'w') as csvfile: 
     outcsv = csv.writer(csvfile, delimiter=',',quotechar='"', quoting = csv.QUOTE_MINIMAL) 

     header = State.__table__.columns.keys() 

     outcsv.writerow(header)  

     for record in q.all(): 
      outcsv.writerow([getattr(record, c) for c in header ]) 

if __name__ == "__main__": 
    export() 

परिणाम:

नाम, जो अल्कोहल, देश, is_state, is_lower48, स्लग, अक्षांश, देशांतर, जनसंख्या, क्षेत्र अलास्का, एके, यूएस, वाई, एन, अलास्का, 61.370716, -152.404419,710231,571951.25 अलबामा, एएल, यूएस, वाई, वाई, अलाबामा, 32.806671, -86.79113,4779736,50744.0 अरकंसास, एआर, यूएस, वाई, वाई, अरकंसास, 34.9 670704, -92.373123,2915918,52068.17 एरिजोना, एजेड, यूएस, वाई, वाई, एरिजोना, 33.72 9 75 9, -111.431221,6392017,113634.57 कैलिफ़ोर्निया, सीए, यूएस, वाई , वाई, कैलिफोर्निया, 36.116203, -11 9.681564,37253956,155939.52 कोलोराडो, सीओ, यूएस, वाई, वाई, कोलोराडो, 39.059811, -105.311104,5029196,103717.53 कनेक्टिकट, सीटी, यूएस, वाई, वाई, कनेक्टिकट, 41.597782, - 72.755371,3574097,4844.8 कोलंबिया जिला, डीसी, यूएस, एन, एन, जिला-कोलम्बिया जिला, 38.8 9 7438, -77.026817,601723,68.34 डेलावेयर, डीई, यूएस, वाई, वाई, डेलावेयर, 39.318523, -75.507141, 897934,1953.56 फ्लोरिडा, फ्लोरिडा, अमेरिका, वाई, वाई, फ्लोरिडा, २७.७,६६,२७९, -81.686783,18801310,53926.82 जॉर्जिया, GA, अमेरिका, वाई, वाई, जॉर्जिया, ३३.०,४०,६१९, -83.643074,9687653,57906.14