2014-06-18 2 views
12

के साथ फ्लास्क में फ्रीज करता है मैं फ्लास्क एप्लिकेशन के लिए टेस्ट केस लिख रहा हूं।drop_all() SQLAlchemy

मेरे पास एक सेटअप विधि है जो उन्हें फिर से बनाने से पहले डीबी में टेबल को छोड़ देती है। यह इस तरह दिखता है:

def setUp(self): 
    # other stuff... 
    myapp.db.drop_all() 
    myapp.db.create_all() 
    # db creation... 

यह पहला परीक्षण के लिए ठीक काम करता है, लेकिन इससे पहले दूसरे टेस्ट चलाया जाता है यह drop_all-कभी स्थिर।

संपादित करें: स्टैक ट्रेस जब प्रक्रिया

File "populate.py", line 70, in create_test_db 
    print (myapp.db.drop_all()) 
    File ".../flask_sqlalchemy/__init__.py", line 864, in drop_all 
    self._execute_for_all_tables(app, bind, 'drop_all') 
    File ".../flask_sqlalchemy/__init__.py", line 848, in _execute_for_all_tables 
    op(bind=self.get_engine(app, bind), tables=tables) 
    File ".../sqlalchemy/sql/schema.py", line 3335, in drop_all 
    .... 
    File "/Library/Python/2.7/site-packages/MySQLdb/cursors.py", line 190, in execute 
    r = self._query(query) 

किसी एक सुराग कैसे इसे ठीक करने की है दखल इस तरह दिखता है?

उत्तर

14

ओकी, वहाँ अन्य समाधान हो सकता है, लेकिन अब के लिए, interwebs खोज करने के बाद, मैंने पाया कि समस्या गायब हो जाता है अगर मैं एक myapp.db.session.commit() के साथ मेरे कोड पहले जोड़ें। मुझे लगता है, कहीं एक लेनदेन करने की प्रतीक्षा कर रहा था।

def setUp(self): 
    # other stuff... 
    myapp.db.session.commit() #<--- solution! 
    myapp.db.drop_all() 
    myapp.db.create_all() 
    # db creation... 
+2

एक ही मुद्दा postgres के साथ किया गया था। – tbicr

0

मैं एक ही समस्या, मेरे मामले में मैं 2 अलग ही मेज पर प्रश्न पूछें सत्र नहीं था। मेरा समाधान दोनों स्थानों के लिए एक scoped_session का उपयोग करना था।

मैं एक अलग मॉड्यूल में यह बनाया तो मैं परिपत्र निर्भरता के साथ समस्या यह नहीं था, इस तरह:

db.py:

from flask.ext.sqlalchemy import SQLAlchemy 
db = SQLAlchemy() 

models.py:

from .db import db 
class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 

एप्लिकेशन .py:

from flask import Flask 
from .db import db 
app = Flask(__name__) 
db.init_app(app) 

आपके सभी कोड में केवल db.session का उपयोग करके गारंटी होगी कि आप एक ही सत्र में हैं। परीक्षणों में, सुनिश्चित करें कि आप tearDown पर रोलबैक निष्पादित करते हैं। SQLAlchemy में सत्र के बारे में

def __init__(self, conn_str): 
     self.engine = create_engine(conn_str) 
     self.session_factory = sessionmaker(engine) 

    def drop_all(self): 
     self.session_factory.close_all() # <- don't forget to close 
     Base.metadata.drop_all(self._engine) 

अधिक जानकारी अपने अनुप्रयोग में और आह्वान drop_all के बाद