2012-12-27 6 views
5

के बजाय एक टुपल से कई पंक्तियां डालें, मेरे पास 2 डी ट्यूपल (या एक नम्पी टेबल से आने का कहना है) में डेटा है, और उसे एक SQL तालिका में डालने की आवश्यकता है। एसक्यूएलकेमी कोर का उपयोग SQLite के साथ, मैं अपने डेटा में कुशलतापूर्वक और बस इस डेटा को कैसे सम्मिलित कर सकता हूं?स्क्लेल्चेमी कोर,

iee @eclaird से लें;

engine = sa.create_engine('sqlite://', echo=True) 
metadata = sa.MetaData() 

widgets_table = sa.Table('widgets', metadata, 
    sa.Column('id', sa.Integer, primary_key=True), 
    sa.Column('bar', sa.String(50)), 
    sa.Column('biz', sa.Boolean), 
    sa.Column('baz', sa.Integer), 
    ) 
metadata.create_all(engine) 

# Assuming this is the data where None holds place for primary key 
my_data = [ 
    (None, "Test", True, 3), 
    (None, "Test", True, 3), 
    ] 

अब तक मैं डॉक्स में this point पर हूँ; तो मेरे पास है;

engine.execute(widgets_table.insert().values((None, "Test", True, 3))) 

जो काम करता है। लेकिन मैं कई पंक्तियों को एक साथ

engine.execute(widgets_table.insert().values(((None, "Test", True, 3), (None, "Test", True, 3)))) 

लेकिन फिर त्रुटि;

The 'sqlite' dialect with current database version settings does not support in-place multirow inserts.

भी कोशिश की;

insert = widgets_table.insert() 

engine.execute(insert, [ 
        (None, "Test", True, 3), 
        (None, "Test", True, 3) 
        ]) 

त्रुटि के साथ;

AttributeError: 'tuple' object has no attribute 'keys'

हाल ही में SQLalch में कनवर्ट करने के रूप में, मैं यहां थोड़ा सा खो गया हूं।

उत्तर

2

आप अपने सेटअप के बारे में कुछ विवरण खो रहे हैं इसलिए मैंने कुछ बनाया। टुपल्स डालना मुश्किल है जब तक कि आप तालिका की प्राथमिक कुंजी भी सम्मिलित नहीं कर रहे हैं, तो क्यों डालने से पहले अपने डेटा से एक शब्दकोश नहीं बनाते?

यह SQLAlchemy 0.7.6 और बाद में साथ काम करना चाहिए:

import sqlalchemy as sa 

engine = sa.create_engine('sqlite://', echo=True) 
metadata = sa.MetaData() 

widgets_table = sa.Table('widgets', metadata, 
    sa.Column('id', sa.Integer, primary_key=True), 
    sa.Column('foo', sa.String(50)), 
    sa.Column('bar', sa.String(50)), 
    sa.Column('biz', sa.Boolean), 
    sa.Column('baz', sa.Integer), 
    ) 
metadata.create_all(engine) 

# Assuming this is your data 
values = [ 
    (None, "Test", True, 3), 
    (None, "Test", True, 3), 
    ] 

with engine.connect() as connection: 
    with connection.begin() as transaction: 
     try: 
      markers = ','.join('?' * len(values[0])) 
      ins = 'INSERT INTO {tablename} VALUES ({markers})' 
      ins = ins.format(tablename=widgets_table.name, markers=markers) 
      connection.execute(ins, values) 
     except: 
      transaction.rollback() 
      raise 
     else: 
      transaction.commit() 
+0

धन्यवाद, लेकिन मैं एक अस्थायी dict बनाने से बचने के लिए उम्मीद कर रही थी - मैं अपने कोड में हर जगह स्तंभ नाम याद करने के लिए होने से बचने के लिए चाहते हैं। और क्या यह इस नियम को बनाने के लिए अनावश्यक नहीं है जब मेरे पास पहले से 2 डी टुपल में डेटा है? लेकिन मान लें कि मुझे केवल कॉलम के डेटा प्रकार और क्रम को पता है, क्या यह स्थिति को सम्मिलित करने का एक आसान तरीका है? –

+2

आपको "?" के संयोजन के साथ एक स्ट्रिंग INSERT कथन का उपयोग करने की आवश्यकता होगी पैरामीटर के लिए, जो सीधे पीएसक्लाइट डीबीएपीआई को भेजा जाता है। एसक्यूएलए डालने() निर्माण हमेशा चीजों को आंतरिक रूप से शब्दकोश के रूप में व्यवहार करने जा रहा है। यदि प्रदर्शन लक्ष्य है तो सीधे डीबीएपीआई पहुंच की आवश्यकता होगी। पोर्टेबिलिटी, तो बस 'dict (ज़िप (c.key (c.key में c के लिए c.ckey), पंक्ति) जैसे फ़ंक्शन का उपयोग करें। – zzzeek

+0

कच्चे एसक्यूएल का उपयोग करने के लिए मेरा जवाब संपादित किया गया, मल्टीरो डालने का उपयोग करता है। – tuomur