К основному содержанию
правило

snowflake-snowpark-dbt-cursorrules-prompt-file — правило для Cursor

Правило для Cursor, которое задаёт агенту контекст по Snowpark Python и dbt с адаптером Snowflake. Пригодится, когда пишете пайплайны трансформаций в этих двух инструментах.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/snowflake-snowpark-dbt-cursorrules-prompt-file.mdc
Открыть на GitHub

Что делает snowflake-snowpark-dbt-cursorrules-prompt-file

Правило описывает, как агент должен работать с Snowpark Python — серверным Python API Snowflake. Внутри разобраны абстракции Session, DataFrame, UDF, UDTF, UDAF и хранимых процедур, ленивое вычисление DataFrame и операции вроде filter, select, group_by().agg(), join, save_as_table(). Отдельно идёт блок про dbt с адаптером dbt-snowflake: материализации, инкрементальные модели, dynamic tables, конфиги вроде cluster_by, transient, query_tag, copy_grants и snowflake_warehouse.

Правило не применяется ко всем файлам сразу: в нём стоит alwaysApply: false, поэтому его нужно подключать осознанно. Установка — просто файл .cursor/rules/snowflake-snowpark-dbt-cursorrules-prompt-file.mdc в проекте. Для работы с dbt понадобится pip install dbt-snowflake и заполненный profiles.yml; в примере Session учётные данные берутся из переменных окружения SNOWFLAKE_ACCOUNT, SNOWFLAKE_USER, SNOWFLAKE_PASSWORD.

В правиле есть список антипаттернов, и это самая полезная часть. Агент не станет вытягивать большие DataFrame на клиент через collect(), не будет крутить Python-цикл по строкам вместо векторных операций и не поставит cluster_by на маленькие таблицы. Ещё он не станет использовать {{ this }} без защиты {% if is_incremental() %}.

Какие задачи решает

  • написать Session для Snowpark с данными из переменных окружения
  • собрать инкрементальную модель dbt с ключом и стратегией merge
  • зарегистрировать векторный UDF для инференса модели
  • описать источники и тесты в schema.yml
  • выбрать материализацию под фактовую таблицу

Примеры запросов агенту

  • Напиши Snowpark DataFrame, который фильтрует customers по региону и считает сумму revenue
  • Сделай инкрементальную модель dbt для stg_events с on_schema_change sync_all_columns
  • Проверь мой dbt-проект на антипаттерны из правила

Как установить snowflake-snowpark-dbt-cursorrules-prompt-file

Вручную: положить файлы

.cursor/rules/snowflake-snowpark-dbt-cursorrules-prompt-file.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Из того же набора68

sveltekit-typescript-guide-cursorrules-prompt-file Правило для Cursor, которое настраивает агента на Svelte 5, SvelteKit и TypeScript: структура проекта, руны, состояние. ★ 41 011звёзд репо svelte Правило для Cursor с набором практик по Svelte: структура компонентов, реактивность, сторы, роутинг через SvelteKit и тесты. Пригодится, когда агент пишет или правит код на Svelte. ★ 41 011звёзд репо solidjs-tailwind-cursorrules-prompt-file Правило для Cursor, которое задаёт агенту стиль кода на Solid.js с Tailwind CSS: сигналы, утилитарные классы, структура папок. ★ 41 011звёзд репо solidity-hardhat-cursorrules-prompt-file Правило для Cursor, которое настраивает ИИ-ассистента на разработку смарт-контрактов на Solidity с проверками безопасности и работой через Hardhat. ★ 41 011звёзд репо shopify-theme-dev-liquid Правило для Cursor с набором практик по темам Shopify: Liquid, JavaScript, CSS, доступность и производительность. Пригодится, если пишете тему и хотите, чтобы агент держал структуру. ★ 41 011звёзд репо salesforce-apex-cursorrules-prompt-file Правило для Cursor, которое настраивает ИИ на разработку Salesforce на Apex: очередь вместо @future, паттерны GoF и минимум комментариев. ★ 41 011звёзд репо rtl-right-to-left-i18n-cursorrules-prompt-file Правило Cursor, которое заставляет агента писать CSS и Tailwind по логическим свойствам, а не по left/right. Пригодится, если проект должен работать на арабском, иврите, персидском или урду. ★ 41 011звёзд репо react Правило задаёт агенту Cursor соглашения по React: структура компонентов, хуки, состояние, формы и доступность. Пригодится, когда в проекте много .tsx и .jsx и хочется единый стиль. ★ 41 011звёзд репо

Похожие

snowflake-development Alireza Rezvani Помогает писать Snowflake SQL, настраивать пайплайны с Dynamic Tables или Streams/Tasks, работать со Snowpark Python, dbt и функциями Cortex AI. 25установок dbt-sf-to-bq-translator официальный google Переводит dbt-модели Snowflake в Standardized BigQuery SQL. Нужен для миграции пайплайнов на Google Cloud через Claude Code, Gemini CLI или Codex. CX Codex 2 300установок migrating-dbt-project-across-platforms dbt-labs Скилл помогает перенести dbt-проект между хранилищами данных с помощью dbt Fusion. Он находит различия в SQL-диалектах и сверяет логику через unit-тесты. CX Codex +1 526установок neo4j-snowflake-graph-analytics-skill neo4j-contrib Скилл для запуска графовых алгоритмов Neo4j прямо в Snowflake через SQL CALL, без выгрузки данных. Пригодится, когда таблицы уже лежат в Snowflake. CX Codex +1 752установок cosmos-dbt-core astronomer Превращает проект dbt Core в Airflow DAG или TaskGroup через Astronomer Cosmos. Пригодится, когда нужно расписание и ретраи для моделей dbt. CX Codex +1 962установок snowflake-semanticview официальный github Скилл помогает создавать, изменять и проверять семантические представления Snowflake через Snowflake CLI. Подойдёт для задач с semantic layer и DDL. 9 000установок

Рядом в теме «Данные и базы»

Все правила IDE по теме «Данные и базы» →

Вопросы о snowflake-snowpark-dbt-cursorrules-prompt-file

Как установить snowflake-snowpark-dbt-cursorrules-prompt-file в Cursor?

Скопируйте файл .cursor/rules/snowflake-snowpark-dbt-cursorrules-prompt-file.mdc в проект — это единственный шаг. Правило помечено alwaysApply: false, так что подключайте его к нужным файлам вручную.

Что делает это правило?

Даёт агенту Cursor контекст по Snowpark Python и dbt с адаптером Snowflake: DataFrame API, UDF и UDTF, хранимые процедуры, материализации и конфиги моделей. Плюс список антипаттернов, которых агент будет избегать.

Что нужно для работы с dbt по этому правилу?

Пакет dbt-snowflake и заполненный profiles.yml с аккаунтом, ролью, базой и warehouse. В примере Session учётные данные читаются из переменных окружения SNOWFLAKE_ACCOUNT, SNOWFLAKE_USER и SNOWFLAKE_PASSWORD.

Исходный текст

snowflake-snowpark-dbt-cursorrules-prompt-file.mdc · CC0-1.0
---
description: "Cursor rules for Snowpark Python (DataFrames, UDFs, stored procedures) and dbt with the Snowflake adapter."
globs: **/*
alwaysApply: false
---
// Snowflake Snowpark Python & dbt
// Expert guidance for Snowpark Python development and dbt with the Snowflake adapter

You are an expert in Snowpark Python (Snowflake's server-side Python API) and dbt with the dbt-snowflake adapter. You build production-grade data transformation pipelines using both tools.

// ═══════════════════════════════════════════
// SNOWPARK PYTHON
// ═══════════════════════════════════════════

// Snowpark runs Python server-side in Snowflake warehouses. Data never leaves Snowflake.
// Core abstractions: Session, DataFrame, UDF, UDTF, UDAF, Stored Procedure.

// Session
from snowflake.snowpark import Session
import os
session = Session.builder.configs({
    "account": os.environ["SNOWFLAKE_ACCOUNT"],
    "user": os.environ["SNOWFLAKE_USER"],
    "password": os.environ["SNOWFLAKE_PASSWORD"],
    "role": "my_role", "warehouse": "my_wh", "database": "my_db", "schema": "my_schema"
}).create()

// DataFrame API — Lazy evaluation, builds query plan executed on collect()/show().
df = session.table("customers")
df_filtered = df.filter(df["region"] == "US").select("name", "email", "revenue")
df_agg = df.group_by("region").agg(sum("revenue").alias("total_revenue"))
df_agg.show()

// Key operations: .filter(), .select(), .group_by().agg(), .join(), .sort(),
// .with_column(), .drop(), .distinct(), .limit(), .union_all(), .flatten(),
// .write.save_as_table()

// Scalar UDFs
from snowflake.snowpark.functions import udf
@udf(name="normalize_email", replace=True)
def normalize_email(email: str) -> str:
    return email.strip().lower() if email else None

// Vectorized UDFs (10-100x faster for ML inference):
import pandas as pd
@udf(name="predict_score", packages=["scikit-learn", "pandas"], replace=True)
def predict_score(features: pd.Series) -> pd.Series:
    import pickle, sys
    model = pickle.load(open(sys.path[0] + "/model.pkl", "rb"))
    return pd.Series(model.predict(features.values.reshape(-1, 1)))

// UDTFs (return multiple rows per input):
class Tokenizer:
    def process(self, text: str):
        for token in text.split():
            yield (token,)

tokenize = session.udtf.register(Tokenizer,
    output_schema=StructType([StructField("token", StringType())]),
    input_types=[StringType()], name="tokenize", replace=True)

// Stored Procedures (server-side multi-step logic):
from snowflake.snowpark.functions import sproc
@sproc(name="daily_etl", replace=True, packages=["snowflake-snowpark-python"])
def daily_etl(session: Session) -> str:
    raw = session.table("raw_events")
    cleaned = raw.filter(raw["event_type"].is_not_null())
    cleaned.write.mode("overwrite").save_as_table("cleaned_events")
    return f"Processed {cleaned.count()} rows"

// Third-Party Packages: session.add_packages("pandas", "scikit-learn==1.3.0", "xgboost")
// File Access: session.add_import("@my_stage/model.pkl") for static files.
// pandas on Snowflake (no data movement):
//   import modin.pandas as pd; import snowflake.snowpark.modin.plugin
//   df = pd.read_snowflake("my_table")

// ═══════════════════════════════════════════
// DBT WITH SNOWFLAKE ADAPTER
// ═══════════════════════════════════════════

// Install: pip install dbt-snowflake
// profiles.yml:
my_project:
  target: dev
  outputs:
    dev:
      type: snowflake
      account: myaccount
      user: myuser
      password: "{{ env_var('SNOWFLAKE_PASSWORD') }}"
      role: transformer
      database: analytics
      warehouse: transforming
      schema: public
      threads: 4

// Materializations: view, table, incremental, ephemeral, dynamic_table

// Dynamic Tables in dbt:
// {{ config(materialized='dynamic_table', snowflake_warehouse='transforming', target_lag='1 hour') }}
// SELECT customer_id, SUM(amount) AS lifetime_value FROM {{ ref('stg_orders') }} GROUP BY 1

// Incremental Models:
{{
  config(
    materialized='incremental',
    unique_key='event_id',
    incremental_strategy='merge',
    on_schema_change='sync_all_columns'
  )
}}
SELECT * FROM {{ ref('stg_events') }}
{% if is_incremental() %}
  WHERE event_timestamp > (SELECT MAX(event_timestamp) FROM {{ this }})
{% endif %}

// Snowflake-Specific Configs:
// cluster_by=['col1', 'col2']  — Clustering (large tables only)
// transient=true               — No Fail-safe (lower storage cost)
// query_tag='finance_daily'    — Workload attribution
// copy_grants=true             — Preserve access on replace
// snowflake_warehouse='lg_wh'  — Per-model warehouse override
// secure=true                  — Secure views

// Sources (models/staging/_sources.yml):
sources:
  - name: raw
    database: raw_db
    schema: jaffle_shop
    tables:
      - name: customers
        loaded_at_field: _loaded_at
        freshness:
          warn_after: {count: 12, period: hour}
          error_after: {count: 24, period: hour}

// Testing (schema.yml):
models:
  - name: stg_customers
    columns:
      - name: customer_id
        tests: [unique, not_null]

// Key Commands:
// dbt run, dbt test, dbt build (run+test in order), dbt compile
// dbt run --select my_model+  (model + downstream)
// dbt run --select +my_model  (model + upstream)
// dbt source freshness, dbt docs generate && dbt docs serve

// Custom schema macro (macros/generate_schema_name.sql):
{% macro generate_schema_name(custom_schema_name, node) %}
  {% if custom_schema_name %}{{ custom_schema_name | trim }}{% else %}{{ target.schema }}{% endif %}
{% endmacro %}

// Best Practices
- Prefer vectorized UDFs (pandas) for ML inference — much faster than scalar UDFs.
- Pin package versions in production UDFs and stored procedures.
- Use DataFrame API over raw SQL strings in reusable Python pipelines.
- Use staging models (stg_*) to rename/type-cast, mart models for business tables.
- Use incremental for fact tables; dynamic_table for near-real-time.
- Set on_schema_change='sync_all_columns' on incremental models.
- Use copy_grants=true to avoid permission issues. Tag models for selective execution.
- Use separate warehouses for dbt runs vs analyst queries.

// Anti-Patterns
- Do NOT collect() large DataFrames to client — process server-side.
- Do NOT use Python loops over rows — use DataFrame operations or vectorized UDFs.
- Do NOT use {{ this }} without {% if is_incremental() %} guard.
- Do NOT set cluster_by on small tables (< 1TB).
- Do NOT use materialized='table' for everything — views are free.
- Do NOT hardcode database/schema — use {{ ref() }} and {{ source() }}.

© PatrickJS · CC0-1.0 · PatrickJS/awesome-cursorrules

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой