python 2和python3 引用flask框架連線資料庫sqlalchemy
python 2和python3 引用flask框架連線資料庫sqlalchemy
參考:https://blog.csdn.net/guotiangong/article/details/80139612
Flask-SQLAlchemy 是Flask的資料庫擴充套件,簡化了Flask程式中使用 SQLAlchemy的操作,和其他Flask擴充套件一樣,Flask-SQLAlchemy 也使用 pip 安裝:
pip install flask-sqlalchemy
2. 常見的問題
問題一
python3
中資料庫的驅動選擇pymysql
,Python2
中選擇mysqldb
。在linux上 直接 sudo pip install mysql-python 安裝一下這個驅動就行
Python3在flask_sqlalchemy中相比改動了一些比如模組的匯入。在Python2中應該是
from flask.ext.sqlalchemy impot SQLAlchemy,
在Python3中使用
from flask_sqlalchemy import SQLAlchemy
,這一點對於其餘的Flask擴充套件也是一樣.匯入包的結構與python2中有了改動.
問題二
在<<Flask Web開發:基於Python的Web應用開發實戰>>介紹flask-sqlalchemy的使用的時候SQLALCHEMY_TRACK_MODIFICATIONS` 這個引數,如果沒有配置改引數,在執行程式的時候會報異常.
/home/air/Desktop/microblog/flask/local/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py:839: 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.
設定# # 設定每次請求結束後自動提交資料庫中的改動#
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
flask-sqlalchemy的配置可以檢視文件 http://www.pythondoc.com/flask-sqlalchemy/config.html
問題三
Python3與Python2中資料庫連線URI的也是有區別的.以mysql為例,
python2
SQLALCHEMY_DATABASE_URI = 'mysql://root:[email protected]/tushare?charset=utf8' #這是Python2的
python3
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]/tushare?charset=utf8' #這是Python3的
如果按照python2 的寫法會出現一下錯誤
ModuleNotFoundError: No module named 'MySQLdb'
出現此異常的原因是因為在python2中連線mysql資料庫使用的是MySQLdb,而在python3中連線mysql資料庫使用的是pymysql,如果按照python2的寫法配置資料庫連線的URI,預設就會使用MySQLdb連線資料庫,
3、SQLALchemy模型和表格的對映:
(1)模型的繼承:
模型需要繼承自db.Model
,然後需要對映表中的屬性,需要寫成db.Column
的資料型別
(2)資料型別:
-
db.Integer
代表的是整型資料; -
db.String
代表的是varchar
,並且需要指定其最長的長度,例如:db.String(100)
-
db.Text
代表的是據庫中的text
型別
(3)其他的資料庫引數:
-
primary_key
:代表的是這個欄位是否設定成為主鍵; -
autoincrement
:代表的是這個主鍵是否為自增長的; -
nullable
:代表的是這個欄位是否允許為空,預設可以為空,值為False
時,為非空
(4)將模型真正地建立到資料庫中:
db.create_all()
(5)例如:建立一個article的模型(表):
class Article(db.Model):
__tablename__ = 'article'
id =db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(100),nullable=False
content = db.Column(db.Text,nullable=False)
db.create_all()
4、用SQLAlchemy對已存在資料庫的操作:
- 實際上,使用SQLAlchemy對已存在的資料庫和重新建立的資料庫的方法是相同的:
查看錶的構造:
desc table_name;
在Flask工程檔案中構造物件模型:
查詢表中的資料:
result = Website.query.filter().all()
渲染在網頁上:
{% for res in iresult %}
<p>{{ res.name }}</p>
<p>{{ res.url }}</p>
{% endfor %}
二、建立兩個表之間的關係和外來鍵約束:
1、外來鍵約束:
- 定義一個
User
表的模型:
class User(db.Model):
__tablename__ = 'user_table'
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(10),nullable=False)
- 定義一個
Article
的表的模型:
class Article(db.Model):
__tablename__ = 'article table'
id =db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(10),nullable=False)
content = db.Column(db.Text,nullable=False)
author_id=db.Column(db.Integer,db.ForeignKey('user_table.id'))
author_id
為User
表對Article
表的外來鍵約束,Foreignkey
方法傳入的引數是模型的表名,外來鍵的欄位型別必須和外來鍵表中的欄位型別保持一致
2、建立兩個表中的關係:
- 建立關係:
author = db.relationship('User',backref=db.backref('articles'))
- 給
Article
模型建立一個author
的屬性,可以利用這個屬性通過article.author
來訪問到User
模型中的作者屬性,在通過.username
的屬性,可以查詢到這個作者的作者名 backref
是定義反向引用,可以通過user_pushy.articles.content
來查詢到這個作者的文章內容- 例如:查詢所有文章的標題為‘aaa’的作者:
article_aaa = Article.query.filter(Article.title == 'aaa').first()
print(article_aaa.author.username)
找到使用者名稱為’Pushy’寫的文章的內容:
article_pushy = User.query.filter(User.username =='Pushy').first()
# 得到的result為列表型別:
result = article_pushy.articles[0]
print(result.content)