我当前正在反映一个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")