Python 在Flask中使用SQLAlchemy创建数据库

Python 在Flask中使用SQLAlchemy创建数据库,python,flask,sqlalchemy,Python,Flask,Sqlalchemy,我想知道,在Flask中创建SQLAlchemy数据库需要做什么。根据我的建议,我应该在我的Flask应用程序中创建模型,然后转到Python shell,使用db.create_all()创建这个模型。但这不起作用 我的烧瓶应用程序: import os import flask import settings from flask_sqlalchemy import SQLAlchemy app = flask.Flask(__name__) app.config['SESSION_TYP

我想知道,在Flask中创建SQLAlchemy数据库需要做什么。根据我的建议,我应该在我的Flask应用程序中创建模型,然后转到Python shell,使用db.create_all()创建这个模型。但这不起作用

我的烧瓶应用程序:

import os
import flask
import settings
from flask_sqlalchemy import SQLAlchemy

app = flask.Flask(__name__)
app.config['SESSION_TYPE'] = 'filesystem'
app.secret_key = os.urandom(24)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////database.db'
db = SQLAlchemy(app)
(...)
型号:

from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(15), unique = True)
    password = db.Column(db.String(15), unique = True)
    tasks = db.relationship('Task', backref='author', lazy='dynamic')

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

class Task(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    scene = db.Column(db.String(140), nullable = False)
    state = db.Column(db.Integer(1), nullable = False)
    progress = db.Column(db.Integer(3), nullable = False)
    add_date = db.Column(db.DateTime, nullable = False)
    start_date = db.Column(db.DateTime, nullable = False)
    finish_date = db.Column(db.DateTime, nullable = False)
    rendered_scene = db.Column(db.String(140))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
错误代码:

>>> from app import db
>>> db.create_all()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\flask_sqlalchemy\__init__.py", line 895, in create_all
    self._execute_for_all_tables(app, bind, 'create_all')
  File "C:\Python27\lib\site-packages\flask_sqlalchemy\__init__.py", line 887, in _execute_for_all_tables
    op(bind=self.get_engine(app, bind), **extra)
  File "C:\Python27\lib\site-packages\sqlalchemy\sql\schema.py", line 3420, in create_all
    tables=tables)
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 1727, in_run_visitor
    with self._optional_conn_ctx_manager(connection) as conn:
  File "C:\Python27\lib\contextlib.py", line 17, in __enter__
    return self.gen.next()
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 1720, in_optional_conn_ctx_manager
    with self.contextual_connect() as conn:
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 1910, incontextual_connect
    self.pool.connect(),
  File "C:\Python27\lib\site-packages\sqlalchemy\pool.py", line 338, in connect
    return _ConnectionFairy._checkout(self)
  File "C:\Python27\lib\site-packages\sqlalchemy\pool.py", line 645, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "C:\Python27\lib\site-packages\sqlalchemy\pool.py", line 440, in checkout

    rec = pool._do_get()
  File "C:\Python27\lib\site-packages\sqlalchemy\pool.py", line 1058, in _do_get

    return self._create_connection()
  File "C:\Python27\lib\site-packages\sqlalchemy\pool.py", line 285, in _create_connection
    return _ConnectionRecord(self)
  File "C:\Python27\lib\site-packages\sqlalchemy\pool.py", line 411, in __init__

    self.connection = self.__connect()
  File "C:\Python27\lib\site-packages\sqlalchemy\pool.py", line 539, in __connect
    connection = self.__pool._creator()
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\strategies.py", line 96, in connect
    connection_invalidated=invalidated
  File "C:\Python27\lib\site-packages\sqlalchemy\util\compat.py", line 199, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb)
  File "C:\Python27\lib\site-packages\sqlalchemy\engine\strategies.py", line 90, in connect
    return dialect.connect(*cargs, **cparams)
  File "C:\Python27\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
来自应用程序导入数据库的
>>
>>>db.create_all()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“C:\Python27\lib\site packages\flask\u sqlalchemy\\uuuu init\uuuu.py”,第895行,在create\u all中
self.\u为所有表执行(应用程序、绑定、“创建所有表”)
文件“C:\Python27\lib\site packages\flask\u sqlalchemy\\uuuuu init\uuuuuu.py”,第887行,在所有表的执行中
op(绑定=自身获取引擎(应用,绑定),**额外)
文件“C:\Python27\lib\site packages\sqlalchemy\sql\schema.py”,第3420行,位于create\u all中
表=表)
文件“C:\Python27\lib\site packages\sqlalchemy\engine\base.py”,第1727行,在\u run\u visitor中
使用self.\u可选\u连接\u ctx\u管理器(连接)作为连接:
文件“C:\Python27\lib\contextlib.py”,第17行,输入__
返回self.gen.next()
文件“C:\Python27\lib\site packages\sqlalchemy\engine\base.py”,第1720行,在\u可选\u conn\u ctx\u管理器中
使用self.context_connect()作为连接:
文件“C:\Python27\lib\site packages\sqlalchemy\engine\base.py”,第1910行,incontextract\u connect
self.pool.connect(),
文件“C:\Python27\lib\site packages\sqlalchemy\pool.py”,第338行,在connect中
返回\u连接\u签出(自我)
文件“C:\Python27\lib\site packages\sqlalchemy\pool.py”,第645行,在\u签出中
fairy=\u ConnectionRecord.checkout(池)
文件“C:\Python27\lib\site packages\sqlalchemy\pool.py”,第440行,在签出中
rec=pool.\u do\u get()
文件“C:\Python27\lib\site packages\sqlalchemy\pool.py”,第1058行,在\u do\u get中
返回self.\u创建\u连接()
文件“C:\Python27\lib\site packages\sqlalchemy\pool.py”,第285行,位于\u create\u connection中
返回连接记录(自身)
文件“C:\Python27\lib\site packages\sqlalchemy\pool.py”,第411行,在\uuu init中__
self.connection=self.\u connect()
文件“C:\Python27\lib\site packages\sqlalchemy\pool.py”,第539行,在\uuu connect中
连接=self.\u池.\u创建者()
文件“C:\Python27\lib\site packages\sqlalchemy\engine\strategies.py”,第96行,在connect中
连接无效=无效
文件“C:\Python27\lib\site packages\sqlalchemy\util\compat.py”,第199行,在raise\u from\u cause中
重新释放(类型(异常),异常,tb=exc_tb)
文件“C:\Python27\lib\site packages\sqlalchemy\engine\strategies.py”,第90行,在connect中
返回方言。连接(*cargs,**cparams)
文件“C:\Python27\lib\site packages\sqlalchemy\engine\default.py”,第377行,在connect中
返回self.dbapi.connect(*cargs,**cparams)
sqlalchemy.exc.OperationalError:(OperationalError)无法打开数据库文件
没有

将您的模型剪切并粘贴到您的flask应用程序,然后在flask应用程序旁边创建一个python文件,打开并编写此文件

from app import db
db.create_all()

运行此文件可以解决您的问题。

数据库uri中的
/
过多。格式为
方言+driver://user:pass@主机:端口/db\u名称
。对于SQLite,
db_name
是数据库的路径。您已经指定了绝对路径
/database.db
,这意味着您正试图在文件系统的根目录中创建数据库

使用
sqlite:///database.db
(相对路径)将在(相对于)当前工作目录中创建数据库

您可能希望指定一个绝对路径,但基于项目位置构建它,因为您可以从另一个文件夹运行应用程序。假设您希望在与应用程序安装代码相同的目录中创建db,请构建一个相对于
\uuuu文件\uuu
的路径

db_path = os.path.join(os.path.dirname(__file__), 'app.db')
db_uri = 'sqlite:///{}'.format(db_path)
app.config['SQLALCHEMY_DATABASE_URI'] = db_uri