请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

处理一个表的具体列名的代码的疑惑

课程中的代码是这样的

elif isinstance(target, Identifier):
    # 处理是一个具体的列名的情况
    # 一个小改进点: 这个target.parts是可以包含'.'的(表名(或表的别名).列名), 例如: t1.name
    # 我们不考虑这种场景, 要求用户必须指定表名, 否则报错
    # 如果用户不显式指定表名, 在join同名字段的时候, 会报错, 麻烦
    full_name = target.parts
    if '.' not in full_name:
        raise SQLLogicalPlanError('please set a specific table name')
    # t1.name -> t1, name
    table_name, column = full_name.split('.')
    target_list.append(TableColumn(table_name, column))

疑惑点在于 '.‘的处理,这个就必须强制用户传入的SQL语句的列表必须带有表名(因为不带’.'这里直接raise error了,前面的parser代码也没有看到有对这个列名和表名进行join的操作)
如:

SELECT t1.a FROM t1

如果不带 ’.’ , 那么SQL就是这样传

SELECT a FROM t1

但如果不带‘.’,代码里面就直接raise error了(前面的parser代码也没有看到有对这个列名和表名进行join的操作)

正在回答 回答被采纳积分+3

1回答

Wotchin 2023-10-28 19:51:27
这是因为t1.a会被整体在parser过程中解析为一个整体,类型是identifier 标识符。所以,我们这里是整体判断这个被解析的字符串是否包含点.
0 回复 有任何疑惑可以回复我~
  • 提问者 Ans217 #1
    我看了下讲师源码里的注释,原来是还没处理 select a from t1这种列名a不带表名t1的情况
    
    注释如下
    # select name from t1; <- 我们也可以自动来补充该 t1 表的信息,但是
    # 会增加代码量,其过程,就是从from后面所涉及的表中进行遍历列信息即可
    回复 有任何疑惑可以回复我~ 2023-10-28 21:15:22
  • 提问者 Ans217 #2
    在第4-17章节解释了,OK了
    回复 有任何疑惑可以回复我~ 2023-10-28 22:09:47
  • Wotchin 回复 提问者 Ans217 #3
    👍
    回复 有任何疑惑可以回复我~ 2023-10-28 23:44:24
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信