Flask-SQLALchemy: no such table

I am trying to get Flask-SQLAlchemy to work and work with some icons. Take a look at the two files I use. When I run gwg.py and goto /util/db/create-all , it spits out the error no such table: stories . I thought everything was right. can someone point out what i am missing or what is wrong? It creates data.db, but the file shows as 0Kb

gwg.py:

 application = Flask(__name__) db = SQLAlchemy(application) import models # Utility util = Blueprint('util', __name__, url_prefix='/util') @util.route('/db/create-all/') def db_create_all(): db.create_all() return 'Tables created' application.register_blueprint(util) application.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db' application.debug = True application.run() 

models.py:

 from gwg import application, db class Story(db.Model): __tablename__ = 'stories' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(150)) subscribed = db.Column(db.Boolean) def __init__(self, name): self.name = name self.subscribed = False def toggle_subscription(self): self.subscribed = False if self.subscribed else True 

Edit

Here is a function that seems to be throwing an error, but it shouldn't, because I first go to / util / db / create -all and then reload /. Even after the error, I go to / util / db / create -all and then / and still get the same error

 @application.route('/') def homepage(): stories = models.Story.query.all() return render_template('index.html', stories=stories) 

Stacktrace

 sqlalchemy.exc.OperationalError OperationalError: (OperationalError) no such table: stories u'SELECT stories.id AS stories_id, stories.name AS stories_name, stories.subscribed AS stories_subscribed \nFROM stories' () Traceback (most recent call last) File "C:\Python27\lib\site-packages\flask\app.py", line 1836, in __call__ return self.wsgi_app(environ, start_response) File "C:\Python27\lib\site-packages\flask\app.py", line 1820, in wsgi_app response = self.make_response(self.handle_exception(e)) File "C:\Python27\lib\site-packages\flask\app.py", line 1403, in handle_exception reraise(exc_type, exc_value, tb) File "C:\Python27\lib\site-packages\flask\app.py", line 1817, in wsgi_app response = self.full_dispatch_request() File "C:\Python27\lib\site-packages\flask\app.py", line 1477, in full_dispatch_request rv = self.handle_user_exception(e) File "C:\Python27\lib\site-packages\flask\app.py", line 1381, in handle_user_exception reraise(exc_type, exc_value, tb) File "C:\Python27\lib\site-packages\flask\app.py", line 1475, in full_dispatch_request rv = self.dispatch_request() File "C:\Python27\lib\site-packages\flask\app.py", line 1461, in dispatch_request return self.view_functions[rule.endpoint](**req.view_args) File "C:\Users\kylee\Code\GWG\gwg.py", line 20, in homepage stories = models.Story.query.all() File "C:\Python27\lib\site-packages\sqlalchemy\orm\query.py", line 2104, in all return list(self) File "C:\Python27\lib\site-packages\sqlalchemy\orm\query.py", line 2216, in __iter__ return self._execute_and_instances(context) File "C:\Python27\lib\site-packages\sqlalchemy\orm\query.py", line 2231, in _execute_and_instances result = conn.execute(querycontext.statement, self._params) File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 662, in execute params) File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 761, in _execute_clauseelement compiled_sql, distilled_params File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 874, in _execute_context context) File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 1024, in _handle_dbapi_exception exc_info File "C:\Python27\lib\site-packages\sqlalchemy\util\compat.py", line 163, in raise_from_cause reraise(type(exception), exception, tb=exc_tb) File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 867, in _execute_context context) File "C:\Python27\lib\site-packages\sqlalchemy\engine\default.py", line 324, in do_execute cursor.execute(statement, parameters) OperationalError: (OperationalError) no such table: stories u'SELECT stories.id AS stories_id, stories.name AS stories_name, stories.subscribed AS stories_subscribed \nFROM stories' () The debugger caught an exception in your WSGI application. You can now look at the traceback which led to the error. To switch between the interactive traceback and the plaintext one, you can click on the "Traceback" headline. From the text traceback you can also create a paste of it. For code execution mouse-over the frame you want to debug and click on the console icon on the right side. You can execute arbitrary Python code in the stack frames and there are some extra helpers available for introspection: dump() shows all variables in the frame dump(obj) dumps all that known about the object Brought to you by DON'T PANIC, your friendly Werkzeug powered traceback interpreter. 
+6
source share
1 answer

The problem here is that there is one of them in the Python import system. This can be simplified by the following explanation ...

Suppose you have two files in a directory ...

a.py:

 print 'a.py is currently running as module {0}'.format(__name__) import b print 'a.py as module {0} is done'.format(__name__) 

b.py:

 print 'b.py is running in module {0}'.format(__name__) import a print 'b.py as module {0} is done'.format(__name__) 

The results of python a.py as follows ...

 a.py is currently running as module __main__ b.py is running in module b a.py is currently running as module a a.py as module a is done b.py as module b is done a.py as module __main__ is done 

Note that when starting a.py module is called __main__ .

Now think about the code you have. In it, your a.py script creates application and db objects. However, these values ​​are not stored in a module named a , they are stored in a module named __main__ . So b.py trying to import a , it DOES NOT import the values ​​you just created a few seconds ago! Instead, since it does not find module a , it creates the NEW module by starting a.py SECOND TIME and storing the results in module a .

You can use print operators, for example, what I showed above, so I hope will guide you through the whole process to see exactly what is happening. The solution is to make sure that you only a.py ONCE, and when b.py imports a , it imports the same values ​​as a.py , rather than importing it a second time.

The easiest way to fix this is to create a python script that is designed only to run the application. Remove application.run() from the end of gwg.py and add the following script ...

main.py:

 from gwg import application application.run() 

Then run with python main.py

+10
source

Source: https://habr.com/ru/post/948603/


All Articles