【发布时间】:2019-08-01 11:02:11
【问题描述】:
我已阅读以下链接: Sqlalchemy adding multiple records and potential constraint violation
使用 SQLAlchemy 核心库执行插入是更快的选择,而不是 ORM 的 session.add() 方法:
即:
session.add()
应替换为:
session.execute(Entry.__table__.insert(), params=inserts)
在以下代码中,我尝试将 .add 替换为 .insert:
from sqlalchemy import Column, DateTime, String, Integer, ForeignKey, func
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Department(Base):
__tablename__ = 'department'
id = Column(Integer, primary_key=True)
name = Column(String)
class Employee(Base):
__tablename__ = 'employee'
id = Column(Integer, primary_key=True)
name = Column(String)
# Use default=func.now() to set the default hiring time
# of an Employee to be the current time when an
# Employee record was created
hired_on = Column(DateTime, default=func.now())
department_id = Column(Integer, ForeignKey('department.id'))
# Use cascade='delete,all' to propagate the deletion of a Department onto its Employees
department = relationship(
Department,
backref=backref('employees',
uselist=True,
cascade='delete,all'))
from sqlalchemy import create_engine
engine = create_engine('postgres://blah:blah@blah:blah/blah')
from sqlalchemy.orm import sessionmaker
session = sessionmaker()
session.configure(bind=engine)
Base.metadata.create_all(engine)
d = Department(name="IT")
emp1 = Employee(name="John", department=d)
s = session()
s.add(d)
s.add(emp1)
s.commit()
s.delete(d) # Deleting the department also deletes all of its employees.
s.commit()
s.query(Employee).all()
#插入选项尝试
from sqlalchemy.dialects.postgresql import insert
d = insert(Department).values(name="IT")
d1 = d.on_conflict_do_nothing()
s.execute(d1)
emp1 = insert(Employee).values(name="John", department=d1)
emp1 = emp1.on_conflict_do_nothing()
s.execute(emp1)
我收到的错误:
sqlalchemy.exc.CompileError: Unconsumed column names: department
我不太了解语法以及如何以正确的方式进行操作,我是 SQLAlchemy 的新手。
看来我的问题类似于How to get primary key columns in pd.DataFrame.to_sql insertion method for PostgreSQL "upsert" ,因此有可能通过回答我们的任何一个问题,您可以同时帮助两个人;-)
【问题讨论】:
标签: python sql python-3.x postgresql sqlalchemy