2015-02-16 4 views
2

Я следую учебник с этой страницы:SQLAlchemy db.create_all() демо терпит неудачу

https://pythonhosted.org/Flask-SQLAlchemy/quickstart.html

Я считаю, что это сделал именно линия для линии. Но я получаю ошибку каждый раз, когда я пытаюсь выполнить db.create_all()

Вот мой код (я переместил фактический файл db.create_all(), чтобы быть частью файла для простоты здесь, хотя я пробовал его как учебник показывает, а в командной строке.

from flask import Flask 
from flask.ext.sqlalchemy import SQLAlchemy 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' 
db = SQLAlchemy(app) 


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

    def __init__(self, username, email): 
     self.username = username 
     self.email = email 

    def __repr__(self): 
     return '<User %r>' % self.username 

db.create_all() 

Я нашел аналогичный вопрос о переполнении стека в Flask SQLAlchemy db.create_all() not creating database

и

SQLAlchemy create_all() does not create tables

Но этот ответ мне не помог. (На самом деле ответ на второй, кажется, есть серьезная ошибка)

Это все в Python 3.4

Я получаю ошибку очень долго, но вот это:

Traceback (most recent call last): 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\engine\strategies.py", line 90, in connect 
    return dialect.connect(*cargs, **cparams) 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\engine\default.py", line 377, in connect 
    return self.dbapi.connect(*cargs, **cparams) 
sqlite3.OperationalError: unable to open database file 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    import test_create_db.py 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\test_create_db.py", line 25, in <module> 
    db.create_all() 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\flask_sqlalchemy\__init__.py", line 895, in create_all 
    self._execute_for_all_tables(app, bind, 'create_all') 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\flask_sqlalchemy\__init__.py", line 887, in _execute_for_all_tables 
    op(bind=self.get_engine(app, bind), **extra) 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\sql\schema.py", line 3404, in create_all 
    tables=tables) 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\engine\base.py", line 1615, in _run_visitor 
    with self._optional_conn_ctx_manager(connection) as conn: 
    File "C:\Python34\Lib\contextlib.py", line 59, in __enter__ 
    return next(self.gen) 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\engine\base.py", line 1608, in _optional_conn_ctx_manager 
    with self.contextual_connect() as conn: 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\engine\base.py", line 1798, in contextual_connect 
    self.pool.connect(), 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\pool.py", line 338, in connect 
    return _ConnectionFairy._checkout(self) 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\pool.py", line 644, in _checkout 
    fairy = _ConnectionRecord.checkout(pool) 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\pool.py", line 440, in checkout 
    rec = pool._do_get() 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\pool.py", line 1057, in _do_get 
    return self._create_connection() 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\pool.py", line 285, in _create_connection 
    return _ConnectionRecord(self) 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\pool.py", line 411, in __init__ 
    self.connection = self.__connect() 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\pool.py", line 538, in __connect 
    connection = self.__pool._creator() 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\engine\strategies.py", line 96, in connect 
    connection_invalidated=invalidated 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\util\compat.py", line 188, in raise_from_cause 
    reraise(type(exception), exception, tb=exc_tb, cause=exc_value) 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\util\compat.py", line 181, in reraise 
    raise value.with_traceback(tb) 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\engine\strategies.py", line 90, in connect 
    return dialect.connect(*cargs, **cparams) 
    File "C:\Programming\LearningFlask\FlaskCookbook\test_create_db\python\lib\site-packages\sqlalchemy\engine\default.py", line 377, in connect 
    return self.dbapi.connect(*cargs, **cparams) 
sqlalchemy.exc.OperationalError: (OperationalError) unable to open database file None None 

ответ

3

Вы используете Windows, и в Windows не существует временного каталога /tmp. Соединение с базой данных завершается сбоем, потому что SQLite3 не имеет каталога для создания файла базы данных. Выберите другое местоположение для файла базы данных.

В этом случае, вы можете использовать tempfile.gettempdir() построить путь:

import tempfile 
import os.path 

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(
    tempfile.gettempdir(), 'test.db') 
+0

LOL. Я закончил работу: app.config ['SQLALCHEMY_DATABASE_URI'] = 'sqlite: ///test.db', и это сработало. –

+0

@BruceNielson: но учтите, что теперь вы помещаете файл в текущий рабочий каталог, где бы это ни было (это зависит от того, как вы начинаете процесс) –

Смежные вопросы