为了账号安全,请及时绑定邮箱和手机立即绑定

不同列名的 WHERE 子句

不同列名的 WHERE 子句

摇曳的蔷薇 2022-07-26 17:03:51
下面的脚本反映了我更新、编辑的尝试(遵循下面的建议)用操作数据库中的表中的行填充维度表,前提是来自 OPDB 中相关表的连接 ID 列创建的 PANDAS 数据帧中的主键不存在在维度表中。import mysql.connectorimport pandas as pd        ...op_cursor = op_connector.cursordwh_cursor = dwh_connector.cursor        ...class dimension_table:  def __init__(self, dwh_cols, op_cols, dim_id, dwh_table_name, op_table_name,op_args=None, dwh_args=None):    self.dwh_cols = ('')    self.op_cols = ('')    self.dim_id = dim_id    self.dwh_table_name = dwh_table_name    self.op_table_name = '`*opdb.*`.' + op_table_name    self.op_args = ",".join(op_cols)    self.dwh_args = ",".join(dwh_cols)        ...billing_address_data = dimension_table(("id","address", "alias", "postal_code", "type", "city", "country",                                        "geolocation"),                                      ("id","address", "alias", "postal_code", "type", "city", "country",                                        "geolocation"),                                      billing_address_dim_id,'billing_address_dim', 'billing_address')        ...def load_dim(instance):sql = """INSERT INTO {dwh} ({dwh_cols})         SELECT {op_cols}          FROM {op}         WHERE {pk} NOT IN            (SELECT {pk} FROM {dwh} WHERE id = %s)         LIMIT 1      """for key in instance.dim_id:    try:                    # ID APPEND        dwh_cursor.execute(sql.format(dwh = instance.dwh_table_name,                                      dwh_cols = instance.dwh_args,                                      op_cols = instance.op_args,                                      op = instance.op_table_name,                                      pk = 'id'),                           str(key))        dwh_connector.commit()
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

通过使用一个带有子句的纯插入选择 SQL 查询来考虑try/except并避免所有查询构建和检查,因为这反映了非重复追加查询的需求。请参阅NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL。fetchIN


下面使用LIMIT 1替换fetchone(),否则使用TOP 1或fetch first 1 rows only取决于 RDBMS。此外,参数占位符使用%s,否则?根据 Python DB-API 使用。import在以后的帖子中,始终标记 RDBMS 并用线条显示 DB-API 。


def load_dim(instance):

    sql = """INSERT INTO {dwh} ({dwh_cols})

             SELECT {op_cols} 

             FROM {op}

             WHERE {pk} NOT IN

                (SELECT {pk} FROM {dwh} WHERE {pk} = %s)

             LIMIT 1

          """

    for key in instance.dim_id:


        try:            

            # ID APPEND

            dwh_cursor.execute(sql.format(dwh = instance.dwh_table_name,

                                          dwh_cols = instance.dwh_args,

                                          op_cols = instance.op_args,

                                          op = instance.op_table_name,

                                          pk = 'id'),

                               (str(key),))


            dwh_connector.commit()


        except Exception as e:                          # ADJUST TO DB-API SPECIFIC Error

            # ORDER_ID APPEND

            dwh_cursor.execute(sql.format(dwh = instance.dwh_table_name,

                                          dwh_cols = instance.dwh_args,

                                          op_cols = instance.op_args,

                                          op = instance.op_table_name,

                                          pk = 'order_id'),

                               (str(key),))


            dwh_connector.commit()


        billing_profile_op_id = dwh_cursor.lastrowid    # RETURNS 0 IF NO DATA APPENDED


查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号