将数据插入特定的表格(sqlalchemy)

8
使用SQLAlchemy向数据库中插入数据非常简单。
address.name = 'Joe'
address.age = 26
session.add(address)

但实际上我有三张表 - 我怎样指定我要插入数据的表呢?


你的意思是三个类似的表格吗? - Prof. Falken
2个回答

29

我使用 SQL 表达式语言添加了新行来解决这个问题:

engine.execute(table_addresses.insert(), name='Joe', age=20)
engine.execute(table_contacts.insert(), email='joe@something.com', cellnumber='267534320')

通常我使用ORM,但在我的情况下,这更方便。


6
如果你正在使用一个会话,那么请使用 session.execute(table_addresses.insert().values(name='Joe', age=20)) 代替。 - Derek 朕會功夫
这种方法与使用会话相比有何优势?如果表是最近动态创建的,engine.execute 能起作用吗? - Ciasto piekarz

14

你可能会想要查看SQLAlchemy ORM教程

不过,为了让你开始工作,我猜想你需要设置类似以下的内容。

from sqlalchemy import Column, Integer, String
class Address(Base):
    __tablename__ = 'addresses'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    age = Column(Integer)

    def __init__(self, name, age):
        self.name = name
        self.age = age

现在看起来你已经知道如何获取会话,那么你可以直接这样做

address = Address('Joe', 26)
session.add(address)
session.commit() # This will do the actual database insertion

虽然你可能可以试着实时操作,但这很可能不会让你的生活更加轻松,因为你仍需要告诉它哪些对象与整数、字符串等相关联,以映射到数据库表中。


这也是我向数据库添加数据的方式。假设数据库中有多个表,如何指定将数据添加到“联系人”表而不是“地址”表? - jokober
如上所述,您可以使用__tablename__ ='addresses'来指定表名为addresses。但如果您要处理几个具有不同名称的相同表格,该怎么办呢? - Jamie Starke
如果您有不同的表格,我建议您使用不同的类来映射它们。__tablename__将用于告诉它要匹配到数据库中的实际表格。例如,基于您的contacts示例,您可能会将class行替换为class Contact(Base):,并将__tablename__行替换为__tablename__ = 'contacts'。您是否正在尝试动态地将它们分别插入不同的表格? - Jamie Starke
是的,我想要动态地将它们添加到不同的表中。 - jokober
当我尝试添加数据时,出现了“我不在映射类中”的错误。 - jokober
这个回答误解了问题。 - scottydelta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接