什么是sqlalchemy
sqlalchemy是一个ORM(对象相关 - 贴)。这是一个开源Python库,它为我们提供了将数据从SQL数据库表传输到Python对象和类的工具。这使开发人员具有在编写Python代码的多功能性的同时操纵和管理数据库的能力。
任务
假设即将举行的篮球联赛,联盟专员已任命您组织联盟的数据。专员希望您跟踪每个团队的胜利和损失以及团队中球员的统计数据。我们该怎么做?
楷模
假设您已经有Python和虚拟环境设置 -
首先,我们需要安装sqlalchemy。在您的终端写:
pipenv install alchemy
接下来,我们需要开始从库导入。这些导入对于使用您将要制作的数据库至关重要。在新文件中,我们需要写:
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_key
和ForeignKey
来建立表之间的关系。
关系
通过使用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
数据库,并发现这些表正在显示:
结论
恭喜!您现在知道如何使用sqlalchemy。您已经完成了任务,联盟专员对您的工作感到非常满意。您被介绍了一个问题,通过解决方案进行了工作,现在您已经解决了它。有时候,您作为软件开发人员的任务是为数据问题提出解决方案。通过使用SQLalchemy,您将具有编写和开发可以有效管理数据的脚本的功能和多功能性。谢谢您的阅读!