簡體   English   中英

如何使用 SQLAlchemy 將數據庫連接到我們的 flask 應用程序

[英]How to connect data base to our flask app using SQLAlchemy

我想將我的本地主機 MySQL DB 連接到我制作的 flask 應用程序,但我遇到了一些錯誤。

我有這個代碼

from flask import Flask, render_template,request
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

app = Flask(__name__)


app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@localhost/mydatabase'
db = SQLAlchemy(app)

class Contacts(db.Model):
    sno = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), nullable=False)
    phone_num = db.Column(db.String(12), nullable=False)
    msg = db.Column(db.String(120), nullable=False)
    date = db.Column(db.String(12), nullable=True)
    email = db.Column(db.String(20), nullable=False)

@app.route("/")
def home():
    return render_template('index.html')#,name=name)

@app.route("/about")
def about():
    return render_template('about.html')

@app.route("/post")
def post():
    return render_template('post.html')


@app.route("/contact", methods= ['GET', 'POST'])
def contact():
    if(request.method=='POST'):
     # Add entry to the database
        name=request.form.get('name')
        email=request.form.get('email')
        phone=request.form.get('phone')
        message=request.form.get('message')
    
        entry= Contacts(name= name, phone_num = phone, msg=message, email = email)
        db.session.add(entry)
        db.session.commit()

    return render_template('contact.html')
app.run()

我運行了代碼:一切正常,但是當我在 webform 中填寫值以將其放入我的數據庫時,web 頁面顯示以下錯誤

內部服務器錯誤

服務器遇到內部錯誤,無法完成您的請求。 服務器過載或應用程序出錯。

jupyter筆記本中也出現以下錯誤:

C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\flask_sqlalchemy\__init__.py:873: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [06/Apr/2021 23:14:20] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [06/Apr/2021 23:14:23] "GET /contact HTTP/1.1" 200 -
127.0.0.1 - - [06/Apr/2021 23:14:25] "GET /contact HTTP/1.1" 200 -
[2021-04-06 23:14:43,893] ERROR in app: Exception on /contact [POST]
Traceback (most recent call last):
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\engine\base.py", line 2158, in _wrap_pool_connect
    return fn()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 400, in connect
    return _ConnectionFairy._checkout(self)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 788, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 529, in checkout
    rec = pool._do_get()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 1193, in _do_get
    self._dec_overflow()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\util\langhelpers.py", line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\util\compat.py", line 249, in reraise
    raise value
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 1190, in _do_get
    return self._create_connection()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 347, in _create_connection
    return _ConnectionRecord(self)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 474, in __init__
    self.__connect(first_connect_check=True)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 671, in __connect
    connection = pool._invoke_creator(self)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\engine\strategies.py", line 106, in connect
    return dialect.connect(*cargs, **cparams)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\engine\default.py", line 412, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\MySQLdb\__init__.py", line 130, in Connect
    return Connection(*args, **kwargs)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\MySQLdb\connections.py", line 185, in __init__
    super().__init__(*args, **kwargs2)
MySQLdb._exceptions.OperationalError: (2002, "Can't connect to MySQL server on 'localhost' (10061)")

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

Traceback (most recent call last):
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\flask\app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\flask\_compat.py", line 35, in reraise
    raise value
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\flask\app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "<ipython-input-1-cba1a6961fc9>", line 65, in contact
    db.session.commit()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\scoping.py", line 153, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\session.py", line 954, in commit
    self.transaction.commit()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\session.py", line 467, in commit
    self._prepare_impl()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\session.py", line 447, in _prepare_impl
    self.session.flush()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\session.py", line 2313, in flush
    self._flush(objects)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\session.py", line 2440, in _flush
    transaction.rollback(_capture_exception=True)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\util\langhelpers.py", line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\util\compat.py", line 249, in reraise
    raise value
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\session.py", line 2404, in _flush
    flush_context.execute()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 395, in execute
    rec.execute(self)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 560, in execute
    uow
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\persistence.py", line 156, in save_obj
    base_mapper, states, uowtransaction
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\persistence.py", line 286, in _organize_states_for_save
    states):
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\persistence.py", line 1261, in _connections_for_states
    connection = uowtransaction.transaction.connection(base_mapper)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\session.py", line 294, in connection
    return self._connection_for_bind(bind, execution_options)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\session.py", line 398, in _connection_for_bind
    conn = self._parent._connection_for_bind(bind, execution_options)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\orm\session.py", line 409, in _connection_for_bind
    conn = bind.contextual_connect()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\engine\base.py", line 2123, in contextual_connect
    self._wrap_pool_connect(self.pool.connect, None),
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\engine\base.py", line 2162, in _wrap_pool_connect
    e, dialect, self)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\engine\base.py", line 1476, in _handle_dbapi_exception_noconnection
    exc_info
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\util\compat.py", line 265, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\util\compat.py", line 248, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\engine\base.py", line 2158, in _wrap_pool_connect
    return fn()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 400, in connect
    return _ConnectionFairy._checkout(self)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 788, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 529, in checkout
    rec = pool._do_get()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 1193, in _do_get
    self._dec_overflow()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\util\langhelpers.py", line 66, in __exit__
    compat.reraise(exc_type, exc_value, exc_tb)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\util\compat.py", line 249, in reraise
    raise value
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 1190, in _do_get
    return self._create_connection()
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 347, in _create_connection
    return _ConnectionRecord(self)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 474, in __init__
    self.__connect(first_connect_check=True)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\pool.py", line 671, in __connect
    connection = pool._invoke_creator(self)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\engine\strategies.py", line 106, in connect
    return dialect.connect(*cargs, **cparams)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\sqlalchemy\engine\default.py", line 412, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\MySQLdb\__init__.py", line 130, in Connect
    return Connection(*args, **kwargs)
  File "C:\Users\user\Anaconda3\ANACONDA3\lib\site-packages\MySQLdb\connections.py", line 185, in __init__
    super().__init__(*args, **kwargs2)
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (2002, "Can't connect to MySQL server on 'localhost' (10061)") (Background on this error at: http://sqlalche.me/e/e3q8)
127.0.0.1 - - [06/Apr/2021 23:14:43] "POST /contact HTTP/1.1" 500 -

如果有人可以提供幫助,我將不勝感激。 希望得到解決方案

提前致謝,

要獲得解決方案,我們可以不使用 SQLAlchemy_URI

我們可以避免使用 Class 和所有東西,下面的代碼也可以這樣做,它可以工作

from flask import Flask, render_template,request
import pandas as pd
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
from sqlalchemy import text
from datetime import datetime
# import flask_sqlalchemy 
app = Flask(__name__)

# To connect with the database first we have to give database’s address. For that the 
code is:
engine = create_engine('mysql+pymysql://root:@localhost:3307/mydatabase')


# In this if you have not set username or password, you can write “root” as username 
and nothing in password. 
# In db_name you will write database’s name like as we have made in our localhost i.e. 
mydatabase

@app.route("/")
def home():
    return render_template('index.html')#,name=name)

@app.route("/about")
def about():
    return render_template('about.html')

@app.route("/post")
def post():
    return render_template('post.html')


@app.route("/contact", methods= ['GET', 'POST'])
def contact():
    if(request.method=='POST'):

# here we will fetch the data from the html form which we've created an that data will 
be stored here in the below objects
# using the function below i.e.request.form.get()
        name=request.form.get('name')
        email=request.form.get('email')
        phone=request.form.get('phone')
        message=request.form.get('message')
#         Add entry to the database, we'll pass the above objects here as a value in 
the database
        engine.execute('INSERT into mydatabase.contacts(name, phone_num, msg, date, 
email) Values("'+name+'","'+phone+'","'+message+'",CURRENT_DATE(),"'+email+'")')

    return render_template('contact.html')
app.run()
# run the app and click on the link provided
# don't forget to connect your XAMPP and start APACHE and MYSQL 
# I hope this was helpfull

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM