一尘不染

SqlAlchemy中的动态表创建和ORM映射

python

我对使用关系数据库还很陌生,所以我更喜欢使用一个好的ORM来简化事情。我花时间评估了不同的Python
ORM,我认为我需要SQLAlchemy。但是,我已经陷入了精神上的死胡同。

我需要创建一个新表,以与在应用程序的播放器表中创建的播放器的每个实例一起使用。我想我知道如何通过元数据更改表的名称然后调用create函数来创建表,但是我不知道如何将其映射到新的动态类。

有人可以给我一些提示,以帮助我摆脱大脑冻结的困扰吗?这有可能吗?

注意:如果我要问的内容更容易实现,我愿意接受Python中的其他ORM。只需向我展示如何:-)


阅读 226

收藏
2021-01-20

共1个答案

一尘不染

我们被SQLAlchemy宠坏了。
以下内容直接来自本教程
非常容易设置和使用。

由于此操作经常进行,因此
该文档在2011年8月转为全面声明式

设置您的环境(我正在使用SQLite内存数据库进行测试):

>>> from sqlalchemy import create_engine
>>> engine = create_engine('sqlite:///:memory:', echo=True)
>>> from sqlalchemy import Table, Column, Integer, String, MetaData
>>> metadata = MetaData()

定义表:

>>> players_table = Table('players', metadata,
...   Column('id', Integer, primary_key=True),
...   Column('name', String),
...   Column('score', Integer)
... )
>>> metadata.create_all(engine) # create the table

如果打开了日志记录,您将看到SQLAlchemy为您创建的SQL。

定义您的班级:

>>> class Player(object):
...     def __init__(self, name, score):
...         self.name = name
...         self.score = score
...
...     def __repr__(self):
...        return "<Player('%s','%s')>" % (self.name, self.score)

将类映射到您的表:

>>> from sqlalchemy.orm import mapper
>>> mapper(Player, players_table) 
<Mapper at 0x...; Player>

创建一个玩家:

>>> a_player = Player('monty', 0)
>>> a_player.name
'monty'
>>> a_player.score
0

就是这样,您现在有了一个玩家表。

2021-01-20