flask_sqlalchemy和sqlalchemy聯系區別及其使用方式


### 使用SQLAlchemy去連接數據庫:

1.使用SQLALchemy去連接數據庫,需要使用一些配置信息,然后將他們組合成滿足條件的字符串:
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = '1'
USERNAME = 'root'
PASSWORD = 'root'

DB_URI = "mysql+mysqlconnector://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)

2.然后使用`create_engine`創建一個引擎`engine`,
engine = create_engine(DB_URI)

3.構建session對象:所有和數據庫的ORM操作都必須通過一個叫做`session`的會話對象來實現,通過以下代碼來獲取會話對象:
from sqlalchemy.orm import sessionmaker

engine = create_engine(DB_URI)
session = sessionmaker(engine)()


4.將ORM模型映射到數據庫中:
(1)用`declarative_base`根據`engine`創建一個ORM基類。
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine(DB_URI)
Base = declarative_base(engine)
(2)用這個`Base`類作為基類來寫自己的ORM類。要定義`__tablename__`類屬性,來指定這個模型映射到數據庫中的表名。
class Person(Base):
    __tablename__ = 'person'
(3)在這個ORM模型中創建一些屬性,來跟表中的字段進行一一映射。這些屬性必須是sqlalchemy給我們提供好的數據類型。
from sqlalchemy import create_engine,Column,Integer,String

id = Column(Integer,primary_key=True,autoincrement=True)
(4)使用`Base.metadata.create_all()`來將模型映射到數據庫中。
(5) 一旦使用`Base.metadata.create_all()`將模型映射到數據庫中后,即使改變了模型的字段,也不會重新映射了。目前來說,只能刪除這個表重新建了

# Base.metadata.drop_all() # 刪除這個表以及里面的數據
# Base.metadata.create_all() # 新建表以及表結構

### 完整示例代碼
from sqlalchemy import create_engine,Column,Integer,String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = '1'
USERNAME = 'root'
PASSWORD = 'root'

# dialect+driver://username:password@host:port/database
DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)

engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()

class Person(Base):
    __tablename__ = 'person'
    id = Column(Integer,primary_key=True,autoincrement=True)
    name = Column(String(50))
    age = Column(Integer)
    country = Column(String(50))

# Base.metadata.drop_all()
# Base.metadata.create_all()

# 新增多條數據
p1 = Person(name='zhiliao1',age=19,country='china')
p2 = Person(name='zhiliao2',age=20,country='china')
session.add_all([p1,p2])
session.commit()

# 查詢數據
person = session.query(Person).first()
print(person)


### 使用Flask-SQLAlchemy去連接數據庫:
1.數據庫連接:
(1)跟sqlalchemy一樣,定義好數據庫連接字符串DB_URI。
(2)將這個定義好的數據庫連接字符串DB_URI,通過`SQLALCHEMY_DATABASE_URI`這個鍵放到`app.config`中。
示例代碼:app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI
(3)使用`flask_sqlalchemy.SQLAlchemy`這個類定義一個對象,並將`app`傳入進去。
示例代碼:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

2.創建ORM模型:
還是跟使用sqlalchemy一樣,定義模型。現在不再是需要使用`delarative_base`來創建一個基類。而是使用`db.Model`來作為基類。

3.使用session:
以后session也不需要使用`sessionmaker`來創建了。直接使用`db.session`就可以了。操作這個session的時候就跟之前的`sqlalchemy`的`session`是一模一樣的。

4.在模型類中,`Column`、`String`、`Integer`以及`relationship`等,都不需要導入了,直接使用`db`下面相應的屬性名就可以了。
id = db.Column(db.Integer,primary_key=True,autoincrement=True)

# 將ORM模型映射到數據庫:
1. db.drop_all()
2. db.create_all()

### 完整示例代碼
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = '1'
USERNAME = 'root'
PASSWORD = 'root'

DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)

app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

class UserModel(db.Model):
    __tablename__ = 'user_model'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(50),nullable=False)

    def __repr__(self):
        return "<User(username: %s)>" % self.username

# db.drop_all()
# db.create_all()

class Article(db.Model):
    __tablename__ = 'article'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title = db.Column(db.String(50),nullable=False)

# 新增數據
article = Article(title='title one')
db.session.add(article)
db.session.commit()

# 查詢數據
article = Article.query.first()
print(article)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM