如何开始使用Sqlalchemy
#编码 #python #sqlalchemy

什么是sqlalchemy

sqlalchemy是一个ORM(对象相关 - 贴)。这是一个开源Python库,它为我们提供了将数据从SQL数据库表传输到Python对象和类的工具。这使开发人员具有在编写Python代码的多功能性的同时操纵和管理数据库的能力。

任务

假设即将举行的篮球联赛,联盟专员已任命您组织联盟的数据。专员希望您跟踪每个团队的胜利和损失以及团队中球员的统计数据。我们该怎么做?

楷模

假设您已经有Python和虚拟环境设置 -
首先,我们需要安装sqlalchemy。在您的终端写:

pipenv install alchemy

Installing sqlalchemy

接下来,我们需要开始从库导入。这些导入对于使用您将要制作的数据库至关重要。在新文件中,我们需要写:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = delcarative_base() #This will help us avoid from rewriting code

现在,让我们上课。这些类是我们数据库中的表。它们也可以称为数据模型:

class League(Base):
    __tablename__ = 'leagues'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    teams = relationship('Team', backref='league') #one-to-many relationship with Team class

class Team(Base):
    __tablename__ = 'teams'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    league_id = Column(Integer, ForeignKey('leagues.id'))
    league = relationship('League', backref='teams') #many-to-one relationship with League class
    players = relationship('Player', backref='team') #one-to-many relationship with Player class

class Player(Base):
    __tablename__ = 'players'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)
    team_id = Column(Integer, ForeignKey('teams.id'))
    team = relationship('Team', backref='players') #many-to-one relationship with Team class

好吧,让我们快速解剖这些代码行。在每个类中,我们都有__tablename__属性。这就是数据库表将其名称使用的内容。还有Column()对象,其中包含String()Integer()之类的参数。这就是数据库表将用于其列和该列中的数据类型。 Column()对象具有可选的参数,您可以在其中输入primary_keyForeignKey来建立表之间的关系。

关系

通过使用ForeignKey,类将相互建立关系。联赛班和团队班有one-to-many的关系,这意味着只有一个联赛,但很多球队。团队课程也有one-to-many关系,但与球员班。有一个球队有很多球员。

配置引擎

既然我们已经上了课,我们就可以开始创建数据库。为此,我们需要几行代码:

engine = create_engine('sqlite:///league.db')
Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()
  • engine = create_engine():这一行是为我们创建与数据库的连接的原因。在create_engine()函数中,我们有'sqlite:///league.db',该'sqlite:///league.db'告诉数据库,应该在文件league.db中创建一个sqlite数据库。
  • Base.metadata.create_all(engine):这条线告诉引擎,将Base作为参数的类用于创建表。
  • Session = sessionmaker(bind=engine):让我们与数据库互动的句柄
  • session = Session():会话对象的默认构造函数

插入数据

现在,将所有这些都安装到位,我们可以开始插入数据:

league = League(name='MDCrabs')
teams_data = [
    ('Ravens', league),
    ('Orioles', league),
    ('Retrievers', league)
]

players_data = [
    # Team "Ravens"
    ("Dwayne Brown", 22, 'Ravens'),
    ("Kevin Shields", 26, 'Ravens'),
    ("Mack Lee", 23, 'Ravens'),
    ("Jasper Nguyen", 24, 'Ravens'),
    ("Andrew King", 29, 'Ravens'),

    # Team "Orioles"
    ("Joseph Wilson", 30, 'Orioles'),
    ("Keith Martinez", 22, 'Orioles'),
    ("Richard White", 31, 'Orioles'),
    ("Ryan Bolt", 23, 'Orioles'),
    ("Michael Ans", 21, 'Orioles'),

    # Team "Retrievers"
    ("Ben Reef", 27, 'Retrievers'),
    ("Joseph James", 26, 'Retrievers'),
    ("Lee Daniels", 28, 'Retrievers'),
    ("Charlie Nguyen", 24, 'Retrievers'),
    ("Neil Harris", 24, 'Retrievers')
]

请注意,我们插入的所有数据都匹配我们先前创建的模型中的属性。如果我们创建了一个团队,它应该具有团队的姓名,或者如果我们创建了一个球员,则应该具有球员的名称和年龄。

最后,我们可以使用以下代码添加我们的团队和玩家到数据库中:

# Adds teams
teams = []
for team_name, league_instance in teams_data:
    team = Team(name=team_name, league=league_instance) #Creates team instance
    teams.append(team) #Adds team instance to the teams list
    session.add(team) #Adds the team instances into the session

# Adds players
for name, age, team_name in players_data:
    team = next(team for team in teams if team.name == team_name)
    player = Player(name=name, age=age, team=team) #Creates player instance
    session.add(player) #Adds the player instance into the session

session.commit() #Updates the database to match the session

我们编写了所有代码后,我们需要做的所有代码就是运行文件。我们可以通过写作来做到这一点:

python <filename.py>

如果一切都正确完成,您可以打开league.db数据库,并发现这些表正在显示:
League table
Team table

Player table

结论

恭喜!您现在知道如何使用sqlalchemy。您已经完成了任务,联盟专员对您的工作感到非常满意。您被介绍了一个问题,通过解决方案进行了工作,现在您已经解决了它。有时候,您作为软件开发人员的任务是为数据问题提出解决方案。通过使用SQLalchemy,您将具有编写和开发可以有效管理数据的脚本的功能和多功能性。谢谢您的阅读!

来源