2012-08-08 14 views
5

यह मेरा database.pyफ्लास्क आप inq_db() के साथ घोषणात्मक रूप से sqlalchemy का उपयोग कैसे करते हैं?

engine = create_engine('sqlite:///:memory:', echo=True) 
session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine)) 
Base = declarative_base() 
Base.query = session.query_property() 

def init_db(): 
    # import all modules here that might define models so that 
    # they will be registered properly on the metadata. Otherwise 
    # you will have to import them first before calling init_db() 
    import models 
    Base.metadata.create_all(engine) 

है और यह मेरा backend.py

from flask import Flask, session, g, request, render_template 
from database import init_db, session 
from models import * 

app = Flask(__name__) 
app.debug = True 
app.config.from_object(__name__) 

# Serve static file during debug 
if app.config['DEBUG']: 
    from werkzeug import SharedDataMiddleware 
    import os 
    app.wsgi_app = SharedDataMiddleware(app.wsgi_app, { 
    '/': os.path.join(os.path.dirname(__file__), 'static') 
    }) 

@app.route('/') 
def foo(): 
    session.add(User()) 
    session.commit() 
    return "NOTHING HERE." 

if __name__ == "__main__": 
    init_db() 
    app.run(port=8888) 

मैं अजीब बातें की एक जोड़ी देख रहा हूँ:

  1. जब मैं python backend.py कर मैं कर रहा हूँ टेबलों को दो बार बनाया जा रहा है। वही निर्माण तालिका विवरण
  2. जब मैं '/' पर जाता हूं, तो मुझे निम्न त्रुटि मिल रही है जब भी मुझे 100% यकीन है कि तालिकाएं बनाई गई हैं। क्यूं कर?

cursor.execute(statement, parameters) OperationalError: (OperationalError) no such table: users u'INSERT INTO users DEFAULT VALUES'()

+0

क्या आप अपना मॉडल कोड भी पोस्ट कर सकते हैं? सुनिश्चित नहीं है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं। सामान्य रूप से, आपको केवल एक बार डेटाबेस निर्माण (init_db) कॉल करना चाहिए। मैं कम से कम सुझाव देता हूं, इसे backend.py से बाहर ले जाएं और बस एक बार पहले डेटाबेस.py को कॉल करें। – codegeek

उत्तर

8

जब आप एक SQLite डेटाबेस स्मृति में यह केवल विशेष धागा है कि यह बनाया के लिए सुलभ है बना सकते हैं - create_engine('sqlite:////some/file/path/db.sqlite' करने के लिए परिवर्तन create_engine('sqlite:///:memory:') अपनी तालिकाओं उपलब्ध नहीं होगा।

क्यों आप दो बार बनाए गए तालिकाओं को देख रहे हैं - डिफ़ॉल्ट रूप से डीबग मोड में फ्लास्क एक सर्वर के साथ चलता है जो हर बार जब आप अपना कोड बदलते हैं तो पुनः लोड होता है। ऐसा करने के लिए जब यह शुरू होता है तो यह एक नई प्रक्रिया को उत्पन्न करता है जो वास्तव में सर्वर चलाता है - इसलिए सर्वर शुरू करने से पहले आपके init_db फ़ंक्शन को कॉल किया जाता है, फिर सर्वर को अनुरोध करने के लिए सर्वर प्रक्रिया बनाने पर फिर से कॉल किया जाता है।

+1

आप सही हैं कि इन-मेमोरी डेटाबेस थ्रेड-लोकल है। यहां एक महत्वपूर्ण अंतर्दृष्टि है: फ्लास्क के विकास सर्वर में, मार्ग हैंडलर मुख्य धागे की तुलना में एक अलग धागे में चलते हैं। यही कारण है कि वही 'डीबी 'ऑब्जेक्ट वास्तव में विभिन्न डेटाबेस का प्रतिनिधित्व करता है, जिसके आधार पर इसका उपयोग किया जाता है। मैंने इसे यहां नोट करने की कोशिश की है: http://gehrcke.de/2015/05/in-memory-sqlite-डेटा-and-flask-a-threading-trap/ –

संबंधित मुद्दे