![](/img/trans.png)
[英]How to connect remote mySQL db to flask app using SQLAlchemy?
[英]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.