SQL alchemy使用

SQLAlchemy介绍

创建操作数据表

scoped_session线程安全

基本增删查改

新增数据

删除数据

修改数据

查询数据

一对多关系

多对多关系

flask-sqlalchemy与flask-migrate

SQLAlchemy是一个基于Python实现的ORM框架。独立的orm框架,可以轻松的集成到任意项目中去。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

组成部分:

  • Engine,框架的引擎
  • Connection Pooling ,数据库连接池
  • Dialect,选择连接数据库的DB API种类
  • Schema/Types,架构和类型
  • SQL Exprression Language,SQL表达式语言

安装:

pip install sqlalchemy

SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件。

mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
</options></dbname></host></password></username>

原生快速使用

import threading
from sqlalchemy import create_engine

engine = create_engine(
    "mysql+pymysql://root:123@127.0.0.1:3306/test",
    max_overflow=0,  # &#x8D85;&#x8FC7;&#x8FDE;&#x63A5;&#x6C60;&#x5927;&#x5C0F;&#x5916;&#x6700;&#x591A;&#x521B;&#x5EFA;&#x7684;&#x8FDE;&#x63A5;
    pool_size=5,  # &#x8FDE;&#x63A5;&#x6C60;&#x5927;&#x5C0F;
    pool_timeout=30,  # &#x6C60;&#x4E2D;&#x6CA1;&#x6709;&#x7EBF;&#x7A0B;&#x6700;&#x591A;&#x7B49;&#x5F85;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x5426;&#x5219;&#x62A5;&#x9519;
    pool_recycle=-1  # &#x591A;&#x4E45;&#x4E4B;&#x540E;&#x5BF9;&#x7EBF;&#x7A0B;&#x6C60;&#x4E2D;&#x7684;&#x7EBF;&#x7A0B;&#x8FDB;&#x884C;&#x4E00;&#x6B21;&#x8FDE;&#x63A5;&#x7684;&#x56DE;&#x6536;&#xFF08;&#x91CD;&#x7F6E;&#xFF09;
)

def task():
    # &#x4ECE;&#x8FDE;&#x63A5;&#x6C60;&#x4E2D;&#x62FF;&#x4E00;&#x4E2A;&#x94FE;&#x63A5;
    conn = engine.raw_connection()
    cursor = conn.cursor()
    cursor.execute(
        "select * from table_name"
    )
    result = cursor.fetchall()
    print(result)
    cursor.close()
    conn.close()

for i in range(20):
    t = threading.Thread(target=task)
    t.start()

SQLAlchemy只能创建表、删除表、不能修改表。

models.py

import datetime
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Text, DateTime, UniqueConstraint, Index

Base = declarative_base()

class Users(Base):
    id = Column(Integer, primary_key=True)  # id &#x4E3B;&#x952E;
    name = Column(String(32), index=True, nullable=False)  # name&#x5217;&#xFF0C;&#x7D22;&#x5F15;&#xFF0C;&#x4E0D;&#x53EF;&#x4E3A;&#x7A7A;
    email = Column(String(32), unique=True)
    create_time = Column(DateTime, default=datetime.datetime.now)
    extra = Column(Text, nullable=True)

    __tablename__ = 'users'  # &#x6570;&#x636E;&#x5E93;&#x8868;&#x540D;&#x79F0;
    __table_args__ = (
        UniqueConstraint('id', 'name', name='uix_id_name'),  # &#x8054;&#x5408;&#x552F;&#x4E00;
        Index('ix_id_name', 'name', 'email'),  # &#x7D22;&#x5F15;
    )

&#x521B;&#x5EFA;&#x8868;&#xFF0C;&#x540C;&#x6B65;&#x5230;&#x6570;&#x636E;&#x5E93;
def init_db():
"""
    &#x6839;&#x636E;&#x7C7B;&#x521B;&#x5EFA;&#x6570;&#x636E;&#x5E93;&#x8868;
"""
    engine = create_engine(
        "mysql+pymysql://root:332525@127.0.0.1:3306/test",  # &#x6570;&#x636E;&#x5E93;&#x9700;&#x8981;&#x81EA;&#x884C;&#x521B;&#x5EFA;&#xFF0C;&#x65E0;&#x6CD5;&#x81EA;&#x52A8;&#x521B;&#x5EFA;
        max_overflow=0,  # &#x8D85;&#x8FC7;&#x8FDE;&#x63A5;&#x6C60;&#x5927;&#x5C0F;&#x5916;&#x6700;&#x591A;&#x521B;&#x5EFA;&#x7684;&#x8FDE;&#x63A5;
        pool_size=5,  # &#x8FDE;&#x63A5;&#x6C60;&#x5927;&#x5C0F;
        pool_timeout=30,  # &#x6C60;&#x4E2D;&#x6CA1;&#x6709;&#x7EBF;&#x7A0B;&#x6700;&#x591A;&#x7B49;&#x5F85;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x5426;&#x5219;&#x62A5;&#x9519;
        pool_recycle=-1  # &#x591A;&#x4E45;&#x4E4B;&#x540E;&#x5BF9;&#x7EBF;&#x7A0B;&#x6C60;&#x4E2D;&#x7684;&#x7EBF;&#x7A0B;&#x8FDB;&#x884C;&#x4E00;&#x6B21;&#x8FDE;&#x63A5;&#x7684;&#x56DE;&#x6536;&#xFF08;&#x91CD;&#x7F6E;&#xFF09;
    )
    # &#x521B;&#x5EFA;&#x88AB;Base&#x7BA1;&#x7406;&#x7684;&#x6240;&#x6709;&#x8868;
    Base.metadata.create_all(engine)

def drop_db():
"""
    &#x6839;&#x636E;&#x7C7B;&#x5220;&#x9664;&#x6570;&#x636E;&#x5E93;&#x8868;
"""
    engine = create_engine(
        "mysql+pymysql://root:332525@127.0.0.1:3306/test",
        max_overflow=0,  # &#x8D85;&#x8FC7;&#x8FDE;&#x63A5;&#x6C60;&#x5927;&#x5C0F;&#x5916;&#x6700;&#x591A;&#x521B;&#x5EFA;&#x7684;&#x8FDE;&#x63A5;
        pool_size=5,  # &#x8FDE;&#x63A5;&#x6C60;&#x5927;&#x5C0F;
        pool_timeout=30,  # &#x6C60;&#x4E2D;&#x6CA1;&#x6709;&#x7EBF;&#x7A0B;&#x6700;&#x591A;&#x7B49;&#x5F85;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x5426;&#x5219;&#x62A5;&#x9519;
        pool_recycle=-1  # &#x591A;&#x4E45;&#x4E4B;&#x540E;&#x5BF9;&#x7EBF;&#x7A0B;&#x6C60;&#x4E2D;&#x7684;&#x7EBF;&#x7A0B;&#x8FDB;&#x884C;&#x4E00;&#x6B21;&#x8FDE;&#x63A5;&#x7684;&#x56DE;&#x6536;&#xFF08;&#x91CD;&#x7F6E;&#xFF09;
    )
    # &#x5220;&#x9664;&#x88AB;Base&#x7BA1;&#x7406;&#x7684;&#x6240;&#x6709;&#x8868;
    Base.metadata.drop_all(engine)

if __name__ == '__main__':
    init_db()  # &#x521B;&#x5EFA;&#x8868;
    # drop_db()  # &#x5220;&#x9664;&#x8868;

操作数据

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from models import Users

engine = create_engine("mysql+pymysql://root:332525@127.0.0.1:3306/test", max_overflow=0, pool_size=5)

Connection = sessionmaker(bind=engine)

&#x6BCF;&#x6B21;&#x6267;&#x884C;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;&#x65F6;&#xFF0C;&#x90FD;&#x9700;&#x8981;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;Connection
conn = Connection()

orm&#x64CD;&#x4F5C;
obj = Users(name="tom")
conn.add(obj)
&#x63D0;&#x4EA4;&#x4E8B;&#x52A1;
conn.commit()
&#x5173;&#x95ED;session&#xFF0C;&#x5176;&#x5B9E;&#x662F;&#x5C06;&#x8FDE;&#x63A5;&#x653E;&#x56DE;&#x8FDE;&#x63A5;&#x6C60;
conn.close()

在上述操作数据的方式中,如果多个线程同时操作,可能会出现数据错乱的问题。所以要用到scoped_session来保证数据安全。

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session
from models import Users
from threading import Thread

engine = create_engine(
    "mysql+pymysql://root:332525@127.0.0.1:3306/test",
    max_overflow=0,  # &#x8D85;&#x8FC7;&#x8FDE;&#x63A5;&#x6C60;&#x5927;&#x5C0F;&#x5916;&#x6700;&#x591A;&#x521B;&#x5EFA;&#x7684;&#x8FDE;&#x63A5;
    pool_size=5,  # &#x8FDE;&#x63A5;&#x6C60;&#x5927;&#x5C0F;
    pool_timeout=30,  # &#x6C60;&#x4E2D;&#x6CA1;&#x6709;&#x7EBF;&#x7A0B;&#x6700;&#x591A;&#x7B49;&#x5F85;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x5426;&#x5219;&#x62A5;&#x9519;
    pool_recycle=-1  # &#x591A;&#x4E45;&#x4E4B;&#x540E;&#x5BF9;&#x7EBF;&#x7A0B;&#x6C60;&#x4E2D;&#x7684;&#x7EBF;&#x7A0B;&#x8FDB;&#x884C;&#x4E00;&#x6B21;&#x8FDE;&#x63A5;&#x7684;&#x56DE;&#x6536;&#xFF08;&#x91CD;&#x7F6E;&#xFF09;
)

Session = sessionmaker(bind=engine)
&#x4FDD;&#x8BC1;&#x6570;&#x636E;&#x5B89;&#x5168;
session = scoped_session(Session)

def task(i):
    # &#x6570;&#x636E;&#x64CD;&#x4F5C;
    user = Users(name='user%s' % i)
    session.add(user)
    # &#x63D0;&#x4EA4;
    session.commit()
    # &#x5173;&#x95ED;&#x8FDE;&#x63A5;
    session.close()

for i in range(10):
    t = Thread(target=task, args=[i, ])
    t.start()

创建连接:

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session
from models import Users

engine = create_engine(
    "mysql+pymysql://root:332525@127.0.0.1:3306/test",
    max_overflow=0,  # &#x8D85;&#x8FC7;&#x8FDE;&#x63A5;&#x6C60;&#x5927;&#x5C0F;&#x5916;&#x6700;&#x591A;&#x521B;&#x5EFA;&#x7684;&#x8FDE;&#x63A5;
    pool_size=5,  # &#x8FDE;&#x63A5;&#x6C60;&#x5927;&#x5C0F;
    pool_timeout=30,  # &#x6C60;&#x4E2D;&#x6CA1;&#x6709;&#x7EBF;&#x7A0B;&#x6700;&#x591A;&#x7B49;&#x5F85;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x5426;&#x5219;&#x62A5;&#x9519;
    pool_recycle=-1  # &#x591A;&#x4E45;&#x4E4B;&#x540E;&#x5BF9;&#x7EBF;&#x7A0B;&#x6C60;&#x4E2D;&#x7684;&#x7EBF;&#x7A0B;&#x8FDB;&#x884C;&#x4E00;&#x6B21;&#x8FDE;&#x63A5;&#x7684;&#x56DE;&#x6536;&#xFF08;&#x91CD;&#x7F6E;&#xFF09;
)

Session = sessionmaker(bind=engine)
&#x4FDD;&#x8BC1;&#x6570;&#x636E;&#x5B89;&#x5168;
session = scoped_session(Session)

执行原生SQL

&#x7EAF;&#x81EA;&#x5B9A;&#x4E49;sql
res = session.query(Users).from_statement(text("SELECT * FROM users where id>:value")).params(value=5).all()

新增数据

session.add(Users('tom'))  # &#x65B0;&#x589E;&#x4E00;&#x6761;&#x6570;&#x636E;
session.add([Users('tom'), Users('jim')])  # &#x65B0;&#x589E;&#x591A;&#x6761;&#x6570;&#x636E;

删除数据

配合过滤

session.query(Users).filter(Users.id > 5).delete()  # &#x5220;&#x9664;Users&#x8868;&#x4E2D;id&#x5927;&#x4E8E;5&#x7684;

修改数据

配合过滤

id&#x4E3A;1&#xFF0C;name&#x5B57;&#x6BB5;&#x503C;&#x6539;&#x4E3A;abc
session.query(Users).filter(Users.id == 1).update({"name": "abc"})
id&#x4E3A;1&#xFF0C;name&#x5B57;&#x6BB5;&#x503C;&#x6539;&#x4E3A;&#x62FC;&#x63A5;&#x4E0A;'123'
session.query(Users).filter(Users.id == 1).update({Users.name: Users.name + "123"})

查询数据

  • all():获取所有结果
  • first():获取第一个结果
&#x67E5;&#x6240;&#x6709;&#xFF0C;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#x4E3A;&#x5217;&#x8868;&#xFF0C;&#x91CC;&#x9762;&#x6709;&#x4E00;&#x4E2A;&#x4E2A;Users&#x5BF9;&#x8C61;
res = session.query(Users).all()

&#x6307;&#x5B9A;&#x67E5;&#x8BE2;&#x7684;&#x5B57;&#x6BB5;&#xFF1A;select name as xx,age from users;
res = session.query(Users.id, Users.name.label('xx')).all()

&#x901A;&#x8FC7;filter&#x8FC7;&#x6EE4;&#xFF0C;filter()&#x4E2D;&#x5199;&#x6761;&#x4EF6; > < ==
res = session.query(Users).filter(Users.id > 5).all()

filter_by &#x8FC7;&#x6EE4;&#xFF0C;name&#x5B57;&#x6BB5;&#x503C;&#x4E3A;'user2'&#x5E76;&#x4E14;id&#x4E3A;2&#x7684;&#x6570;&#x636E;
res = session.query(Users).filter_by(name='user2', id=2).first()

filter&#x548C;filter_by&#x7684;&#x5176;&#x4ED6;&#x4F7F;&#x7528;
res = session.query(Users).filter(Users.id > 1, Users.name == 'user2').all()  # &#x6761;&#x4EF6;and&#x5173;&#x7CFB;
res = session.query(Users).filter(Users.id.between(7, 9)).all()  # &#x5728;..&#x4E4B;&#x95F4;
res = session.query(Users).filter(Users.id.in_([7, 8, 9])).all()  # &#x5728;..&#x4E4B;&#x4E2D;
res = session.query(Users).filter(~Users.id.between(2, 9)).all()  # &#x53D6;&#x53CD;
res = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='user2'))).all()  # &#x4E8C;&#x6B21;&#x7B5B;&#x9009;

&#x81EA;&#x5B9A;&#x5236;where&#x90E8;&#x5206;&#x67E5;&#x8BE2;sql&#xFF0C;:value&#x76F8;&#x5F53;&#x4E8E;&#x5360;&#x4F4D;&#x7B26;
from sqlalchemy.sql import text
res = session.query(Users).filter(text("id>:value or name=:name")).params(value=2, name='user2').all()

&#x4E0E;and_&#x3001;&#x6216;or_&#x3001;&#x975E;~
from sqlalchemy import and_, or_
res = session.query(Users).filter(or_(Users.id > 5, Users.name == 'user2')).all()
res = session.query(Users).filter(
    or_(
        Users.id > 5,
        and_(Users.name == 'user2', Users.id > 3)
    )
)

&#x6A21;&#x7CCA;&#x5339;&#x914D;&#xFF0C;%&#x4EE3;&#x8868;&#x591A;&#x4E2A;&#x5B57;&#x7B26;
res = session.query(Users).filter(Users.name.like('user%')).all()

&#x9650;&#x5236;&#xFF0C;&#x7528;&#x4E8E;&#x5206;&#x9875;&#xFF0C;&#x5207;&#x5272;
res = session.query(Users)[0:2]

&#x6392;&#x5E8F;&#xFF0C;desc()&#x964D;&#x5E8F;&#xFF0C;asc()&#x5347;&#x5E8F;
res = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()

&#x5206;&#x7EC4;
from sqlalchemy.sql import func
&#x5206;&#x7EC4;&#x4E4B;&#x540E;&#x53D6;&#x6700;&#x5927;id&#xFF0C;id&#x4E4B;&#x548C;&#xFF0C;&#x6700;&#x5C0F;id
res = session.query(
    func.max(Users.id),
    func.sum(Users.id),
    func.min(Users.id)
).group_by(Users.name).all()

haviing&#x7B5B;&#x9009;
res = session.query(
    func.max(Users.id),
    func.sum(Users.id),
    func.min(Users.id)
).group_by(Users.name).having(func.min(Users.id) > 2).all()

&#x8FDE;&#x8868;&#xFF08;&#x9ED8;&#x8BA4;&#x7528;forinkey&#x5173;&#x8054;&#xFF09;
res = session.query(Users, Favor).filter(Users.id == Favor.id).all()
join&#x8868;&#xFF0C;&#x9ED8;&#x8BA4;&#x662F;inner join
res = session.query(Users).join(Favor).all()
isouter=True &#x5916;&#x8FDE;&#xFF0C;&#x8868;&#x793A;Favor left join Favor&#xFF0C;&#x4E24;&#x8868;&#x53CD;&#x8FC7;&#x6765;&#x65E2;&#x662F;&#x53F3;&#x8FDE;&#x63A5;
res = session.query(Users).join(Favor, isouter=True).all()

models.py

from sqlalchemy.orm import relationship
from sqlalchemy import Column, Integer, String, ForeignKey

class Hobby(Base):
    __tablename__ = 'hobby'
    id = Column(Integer, primary_key=True)
    caption = Column(String(50), default='&#x7BEE;&#x7403;')

class Person(Base):
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    # hobby&#x6307;&#x7684;&#x662F;&#x8868;&#x540D;&#x800C;&#x4E0D;&#x662F;&#x7C7B;&#x540D;
    hobby_id = Column(Integer, ForeignKey("hobby.id"))

    # &#x8DDF;&#x6570;&#x636E;&#x5E93;&#x65E0;&#x5173;&#xFF0C;&#x4E0D;&#x4F1A;&#x65B0;&#x589E;&#x5B57;&#x6BB5;&#xFF0C;&#x53EA;&#x7528;&#x4E8E;&#x5FEB;&#x901F;&#x94FE;&#x8868;&#x64CD;&#x4F5C;
    # &#x57FA;&#x4E8E;&#x5BF9;&#x8C61;&#x7684;&#x8DE8;&#x8868;&#x67E5;&#x8BE2;:
    # &#x7C7B;&#x540D;&#xFF0C;backref&#x7528;&#x4E8E;&#x53CD;&#x5411;&#x67E5;&#x8BE2;
    hobby = relationship('Hobby', backref='pers')

新增数据

&#x65B9;&#x5F0F;&#x4E00;&#xFF1A;
session.add(Hobby(caption='dance'))
session.add(Person(name='tom', hobby_id=1))

# &#x65B9;&#x5F0F;&#x4E8C;&#xFF1A;
session.add(Person(name='tony', hobby=Hobby(caption='sing')))

一对多查询

"""&#x57FA;&#x4E8E;&#x5BF9;&#x8C61;&#x7684;&#x8DE8;&#x8868;&#x67E5;&#x8BE2;"""
&#x6B63;&#x5411;&#x67E5;&#x8BE2;
res = session.query(Person).filter(Person.name == 'tom').first()
print(res.hobby.caption)
&#x53CD;&#x5411;&#x67E5;&#x8BE2;
res = session.query(Hobby).filter_by(caption='dance').first()
print(res.pers)

"""&#x57FA;&#x4E8E;&#x8FDE;&#x8868;&#x7684;&#x8DE8;&#x8868;&#x67E5;&#x8BE2;"""
res = session.query(Person, Hobby).filter(Person.hobby_id == Hobby.id, Person.name == 'tom').all()
res = session.query(Person).join(Hobby).filter(Person.name == 'tom').all()
class Person2Hobby(Base):
    __tablename__ = 'person2bobby'
    id = Column(Integer, primary_key=True, autoincrement=True)
    hobby_id = Column(Integer, ForeignKey('hobby.id'))
    person_id = Column(Integer, ForeignKey('person.id'))

class Hobby(Base):
    __tablename__ = 'hobby'
    id = Column(Integer, primary_key=True)
    caption = Column(String(50), default='&#x7BEE;&#x7403;')

class Person(Base):
    __tablename__ = 'person'
    id = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)

    # &#x4E0E;&#x751F;&#x6210;&#x8868;&#x7ED3;&#x6784;&#x65E0;&#x5173;&#xFF0C;&#x4EC5;&#x7528;&#x4E8E;&#x67E5;&#x8BE2;&#x65B9;&#x4FBF;,&#x653E;&#x5728;&#x54EA;&#x4E2A;&#x5355;&#x8868;&#x4E2D;&#x90FD;&#x53EF;&#x4EE5;
    # &#x65B9;&#x4FBF;&#x5FEB;&#x901F;&#x67E5;&#x8BE2;&#xFF0C;&#x5199;&#x4E86;&#x8FD9;&#x4E2A;&#x5B57;&#x6BB5;&#xFF0C;&#x76F8;&#x5F53;&#x4E8E;django &#x7684;manytomany&#xFF0C;&#x5FEB;&#x901F;&#x4F7F;&#x7528;&#x57FA;&#x4E8E;&#x5BF9;&#x8C61;&#x7684;&#x8DE8;&#x8868;&#x67E5;&#x8BE2;
    hobbies = relationship('Hobby', secondary='person2bobby', backref='persons')

新增数据

&#x65B9;&#x5F0F;&#x4E00;&#xFF1A;&#x6240;&#x6709;&#x8868;&#x90FD;&#x6709;&#xFF0C;&#x4E00;&#x4E2A;&#x4E2A;&#x589E;&#x52A0;
session.add_all([
    Person(name='tom'), Person(name='tony'),
    Hobby(caption='sing'), Hobby(caption='dance')
])
session.add_all([
    Person2Hobby(person_id=1, hobby_id=1),
    Person2Hobby(person_id=1, hobby_id=2),
    Person2Hobby(person_id=2, hobby_id=1),
])

&#x65B9;&#x5F0F;&#x4E8C;&#xFF1A;
session.add(Person(name='tom', hobbies=[Hobby(caption='sing'), Hobby(caption='dance')]))

多对多查询

"""&#x57FA;&#x4E8E;&#x5BF9;&#x8C61;&#x7684;&#x8DE8;&#x8868;&#x67E5;&#x8BE2;"""
&#x6B63;&#x5411;&#x67E5;&#x8BE2;
res = session.query(Person).filter_by(name='tom').first()
print(res.hobbies)
&#x53CD;&#x5411;&#x67E5;&#x8BE2;
res = session.query(Hobby).filter_by(caption='sing').first()
print(res.persons)

flask-sqlalchemy:帮助我们快速把sqlalchemy集成到flask中。

flask-migrate:把表同步到数据库中

pip install flask-migrate==2.7.0

settings.py:

SESSION_TYPE = 'redis'  # session&#x7C7B;&#x578B;&#x4E3A;redis
SESSION_KEY_PREFIX = 'session:'  # &#x4FDD;&#x5B58;&#x5230;session&#x4E2D;&#x7684;&#x503C;&#x7684;&#x524D;&#x7F00;
SESSION_PERMANENT = True  # &#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E3A;False&#xFF0C;&#x5219;&#x5173;&#x95ED;&#x6D4F;&#x89C8;&#x5668;session&#x5C31;&#x5931;&#x6548;&#x3002;
SESSION_USE_SIGNER = False  # &#x662F;&#x5426;&#x5BF9;&#x53D1;&#x9001;&#x5230;&#x6D4F;&#x89C8;&#x5668;&#x4E0A; session:cookie&#x503C;&#x8FDB;&#x884C;&#x52A0;&#x5BC6;

SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:332525@127.0.0.1:3306/test"
SQLALCHEMY_POOL_SIZE = 5
SQLALCHEMY_POOL_TIMEOUT = 30
SQLALCHEMY_POOL_RECYCLE = -1
&#x8FFD;&#x8E2A;&#x5BF9;&#x8C61;&#x7684;&#x4FEE;&#x6539;&#x5E76;&#x4E14;&#x53D1;&#x9001;&#x4FE1;&#x53F7;
SQLALCHEMY_TRACK_MODIFICATIONS = False

app.py:

from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from models import Users

app = Flask(__name__)
&#x5BFC;&#x5165;&#x914D;&#x7F6E;&#x6587;&#x4EF6;
app.config.from_pyfile('settings.py')
&#x5B9E;&#x4F8B;&#x5316;&#x5F97;&#x5230;&#x5BF9;&#x8C61;
db = SQLAlchemy()
&#x6CE8;&#x518C;
db.init_app(app)
&#x521B;&#x5EFA;&#x8868;&#x6A21;&#x578B;&#xFF0C;&#x7EE7;&#x627F;db.Model
class Users(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)

@app.route('/')
def index():
    # &#x4F7F;&#x7528;session
    db.session.add(Users(name='tom'))
    db.session.commit()
    return 'index'

manage.py

from flask_script import Manager
from flask_migrate import MigrateCommand, Migrate

from app import app, db

&#x7B2C;&#x4E00;&#x6B65;&#xFF1A;&#x521D;&#x59CB;&#x5316;&#x51FA;flask_script&#x7684;manage
manager = Manager(app)
&#x7B2C;&#x4E8C;&#x6B65;&#xFF1A;&#x4F7F;&#x7528;flask_migrate&#x7684;Migrate  &#x5305;&#x88F9;&#x4E00;&#x4E0B;app&#x548C;db&#xFF08;sqlalchemy&#x5BF9;&#x8C61;&#xFF09;
Migrate(app, db)

&#x7B2C;&#x4E09;&#x6B65;&#xFF1A;&#x628A;&#x547D;&#x4EE4;&#x589E;&#x52A0;&#x5230;flask-script&#x4E2D;&#x53BB;
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
    manager.run()

打开终端输入迁移命令:

1.初始化,项目使用的时候,只敲一次,生成migrations文件夹

python manage.py db init

2.记录变化,增加表,删除表,增加字段,删除字段都需要记录

python manage.py db migrate

3.同步到数据库中

python manage.py db upgrade

4.运行flask

python manage.py runserver

Original: https://blog.csdn.net/weixin_67531112/article/details/128257328
Author: Yietong309
Title: SQL alchemy使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/747898/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球