在反映的sqlalchemy表中插入数据时避免重复

时间:2019-12-18 14:52:50

标签: python sql-server sqlalchemy duplicates bulkinsert

我当前正在反映一个MSSQL表并对其进行批量插入,我的问题是我需要检查/避免重复,并且我不知道如何使用SQLAlchemy语法进行操作。

为了给您一些背景信息,SQL表是抵押贷款人的时间序列,其中包含57个参数,其中包括“贷款ID”,“观察日期”,“帐上月份”,“起源日期”,“利息”率”等。识别重复项的线索在“帐上月份”中,因为每个“贷款ID”在“开始日期”之后的每个月只能有一行。每个贷款ID都有不同的“起始日期”和“观察日期”,但是每个“贷款月”的编码对于每个贷款ID都是相同的。

例如:

当前日期:2018年3月

原定日期:2018年1月30日

观察日期:2018年3月30日

图书月:2(2月为“ 1”,1月为“ 0”)

由于已经填充了MS SQL中的表,所以我想插入新行,但是每个LoanID每月只有一条记录(以防万一有人两次运行插入代码,因此不会复制所有数据)

这是我目前正在整个插入过程,直到出现重复的异常为止(请参见“ sqlalchemy_orm_bulk_insert”或“ sqlalchemy_core_insert”。此外,我知道我创建的用于标准化SQl Alchemy连接插入过程的类可能是有点废话,所以如果有人有任何建议,他们将受到欢迎。

class SQLAlchemy_cashflow():
    def __init__(self,database, user, password, sql_schema="dbo", driver="SQL Server", server="abc"):
        self.sql_schema = sql_schema
        self.driver = driver
        self.server = server
        self.database = database
        self.user = user
        self.password = password

        params = urllib.parse.quote_plus('Driver={'+str(self.driver)+'};'\
                                    "SERVER="+str(self.server)+";"\
                                    "Database="+str(self.database)+";"
                                    "UID="+str(self.user)+";"\
                                    "PWD="+str(self.password)+";"\
                                    "Trusted_Connection=yes"
                                    )
        engine = sa.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)

        self.engine = engine

        conn = engine.connect()
        metadata = MetaData(schema=sql_schema)
        Base = declarative_base(metadata= metadata)
        Base.metadata.reflect(engine)
        Session = sessionmaker(bind=engine)
        session = Session()

        self.metadata = metadata
        self.Base = Base
        self.session = session


    def reflection(self, sql_table):
        self.sql_table = sql_table

        class MyClass(self.Base):
            __table__ = self.Base.metadata.tables[self.sql_table]


        table_reflected = Table(sql_table, self.metadata, autoload=True, autoload_with = self.engine)
        return MyClass, table_reflected


    def sqlalchemy_orm_bulk_insert(self,class_object, df):
        t0 = time.time()
        session.bulk_insert_mappings(class_object,
                                    df.to_dict(orient="record"))

        session.commit()
        print("SQLAlchemy ORM bulk_insert_mappings(): Total time for " + str(len(df)) +
            " records " + str(time.time() - t0) + " secs")


    def sqlalchemy_core_insert(self, class_object, df):
        t0 = time.time()
        engine.execute(class_object.__table__.insert(),
                    df.to_dict(orient="record"))
        print("SQLAlchemy Core: Total time for " + str(len(df)) + " records " +
            str(time.time() - t0) + " secs")

0 个答案:

没有答案