1. 程式人生 > >python 2和python3 引用flask框架連線資料庫sqlalchemy

python 2和python3 引用flask框架連線資料庫sqlalchemy

python 2和python3 引用flask框架連線資料庫sqlalchemy

參考:https://blog.csdn.net/guotiangong/article/details/80139612

  1. Flask-SQLAlchemy

Flask-SQLAlchemy 是Flask的資料庫擴充套件,簡化了Flask程式中使用 SQLAlchemy的操作,和其他Flask擴充套件一樣,Flask-SQLAlchemy 也使用 pip 安裝:

pip install flask-sqlalchemy

2. 常見的問題

問題一

python3中資料庫的驅動選擇pymysqlPython2中選擇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_idUser表對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)