在21世纪,数据成为了最宝贵的商品。企业聚焦于数据的积累,因为更多的数据能够带来更精细和计算化的决策制定,为企业转型打开更多大门。数据的大量积累需要大量的存储空间以及实时决策所需的分析和处理选项。传统的内部基础设施和存储单元已不再适用于现代大数据需求。云服务提供商提供了大量的按需计算和存储解决方案,通过消除基础设施开销来满足大数据需求。
生活在一个实时的世界中。没有经过计算的架构设计,数据的过度扩散可能导致无法管理的数据堆积如山。随着需要分析的数据量的增加,从数据中提取业务洞察的需求将急剧上升。企业不能总是承担得起稍后处理数据的成本,假设他们将获得相同的业务价值。
时间限定的分析需求常常使在查询中硬编码参数/值。在复杂的代码库中进行微小的代码更改可能导致交付延迟。为了简单和易于集成的选项,使用Snowflake的数据仓库来说明问题。这个例子计划向展示如何在运行时使用SnowflakePython连接器动态传递值到SQL查询中,使代码更加灵活和易于管理。
Snowflake是一个现代数据仓库,提供按需存储、复杂的分析和数据库操作,延迟极低。以下是安装Snowflake连接器的链接:https://docs.snowflake.com/en/user-guide/python-connector-install.html#step-1-install-the-connector
让直接进入主题,首先安装连接器的版本特定库。
pip install -r https://raw.githubusercontent.com/snowflakedb/snowflake-connector-python/v2.7.6/tested_requirements/requirements_38.reqs
现在运行pip install来安装所需版本的Snowflake连接器。
pip install snowflake-connector-python==2.7.6
注意:Python连接器提供了集成使用pandas库的功能,请查看安装文档。
要开始查询数据,首先需要连接到云数据仓库。在例子中,需要连接到Snowflake。为了确保连接到数据库并查询所需的表,通过建立安全连接,Snowflake有一些指导方针。
Snowflake的主页上可以找到6个参数中的4个。声明连接将等同于下面的Python变量。
conn = snowflake.connect(user=sfUser, password=sfPwd, account=sf_account, warehouse=sf_warehouse, database=sf_database, schema=sf_schema)
现在已成功建立数据库连接。让声明游标并开始查询。
游标是一个Python类实例,广泛用于调用Python SQL方法来获取、查询和修改表。游标是通过调用连接的cursor()方法创建的。
cur = conn.cursor()
在会话的整个生命周期中,游标绑定到提供的连接规范。
游标连接将接受SQL查询作为Python字符串变量的形式。
query = 'select column1, column2 from test_table WHERE {0} = {1} '
这里的{0}和{1}是字符串插值器,允许在运行时动态传递值。动态值可以直接替换{0}和{1},通过它们的名字,如{column_name}和{value_holder}。但通常避免按名称调用的方法是有益的。
声明打算在运行时传递给SQL查询的动态值。
column_name = 'Site'
value_holder = 'Analytics_vidya'
repr()是Python内置函数,返回指定对象的可打印表示。将格式化查询并将动态值作为格式化的一部分传递。参数的顺序是连续的。第一个元素将在索引0,依此类推。
final_query = query.format(repr(column_name), repr(value_holder))
游标对象提供了一个方法来执行格式化的查询。
cur.execute(final_query)
execute方法将利用连接详情,并从指定的表中获取满足动态条件的记录。
1. 如果明确地将查询传递给游标的execute方法,则查询将被执行。
cur.execute('select * from test_table')
2. 可以通过条件语句使用这些动态调用。
if condition == 'N':
final_query = query.format('static_column_name', repr(value_holder))
else:
final_query = query.format(repr(column_name), 'static_value_holder')
3. 可以将方法/函数参数作为动态值传递。
def dynamic_method(config_parse, column_name):
print(“dynamic variables check”)
query = ‘select column1, column2 from test_table WHERE {0} = {1} ’
final_query = query.format(repr(config), repr(column_name))
4. 可以在多个SQL语句中重用动态变量。
5. 游标的execute方法配备了其他操作,如close(), fetchall(), executemany()等。
这种方法有助于应对SQL注入攻击。代码重构、代码可重用性和可维护性将大幅增加。