Hướng dẫn dynamic sql query in python - truy vấn sql động trong python

Tôi đang sử dụng bộ tham số dưới đây để tạo truy vấn SQL động và chạy nó từ Python.

target_column = 'connect_status'
table_name = 'public.main_table'

query_params = {'month_date' : '201801',
                'churn_date' : ['201802','201803','201804'],
                'disco_target' : '1-3 Month Disco'
                }


for churn in query_params['churn_date']:
    sql_data_sample = str["""select * from {1}
                                where dt = %[month_date]s 
                                and churn_date = %[churn]s
                                and {0} IN [%[disco_target]s,'No Disco'] order by random[] limit 5000
                                ;"""].format[target_column,table_name]
    print [sql_data_sample]


    df_data_sample = pd.read_sql[sql_data_sample,con = cnxn,params = query_params]

Tuy nhiên, điều này cung cấp cho một cơ sở dữ liệu HEARROR:

Execution failed on sql 'select * from public.main_table
                                where dt = %[month_date]s 
                                and churn_date = %[churn]s
                                and connect_status IN [%[disco_target]s,'No Disco'] order by random[] limit 5000
                                ;': 'churn'

Ai đó có thể vui lòng giúp tôi sửa cái này không?

Đã hỏi ngày 12 tháng 11 năm 2018 lúc 6:11Nov 12, 2018 at 6:11

Shuvayan Dasshuvayan DasShuvayan Das

1.1683 huy hiệu vàng19 Huy hiệu bạc38 Huy hiệu đồng3 gold badges19 silver badges38 bronze badges

Vấn đề là do

Execution failed on sql 'select * from public.main_table
                                where dt = %[month_date]s 
                                and churn_date = %[churn]s
                                and connect_status IN [%[disco_target]s,'No Disco'] order by random[] limit 5000
                                ;': 'churn'
4 không có sẵn trong
Execution failed on sql 'select * from public.main_table
                                where dt = %[month_date]s 
                                and churn_date = %[churn]s
                                and connect_status IN [%[disco_target]s,'No Disco'] order by random[] limit 5000
                                ;': 'churn'
5. Sửa đổi mã của bạn thành

for churn in query_params['churn_date']:
    try:
       sql_data_sample = str["""select * from {1}
                            where dt = %[month_date]s 
                            and churn_date = %[churn]s
                            and {0} IN [%[disco_target]s,'No Disco'] order by random[] limit 5000
                            ;"""].format[target_column,table_name]
        print [sql_data_sample]

        query_params['churn'] = churn
        df_data_sample = pd.read_sql[sql_data_sample,con = cnxn,params = query_params]
    except [Exception, psycopg2.DatabaseError] as error:
        print[error]

Anoop Kumar

8151 Huy hiệu vàng8 Huy hiệu bạc19 Huy hiệu đồng1 gold badge8 silver badges19 bronze badges

Đã trả lời ngày 12 tháng 11 năm 2018 lúc 6:19Nov 12, 2018 at 6:19

0

Biểu thức Chuỗi của bạn tham chiếu Dữ liệu trong query_params của bạn nhưng query_params không được tham chiếu trong các tham số của hàm định dạng. Hãy xem cách sử dụng

Execution failed on sql 'select * from public.main_table
                                where dt = %[month_date]s 
                                and churn_date = %[churn]s
                                and connect_status IN [%[disco_target]s,'No Disco'] order by random[] limit 5000
                                ;': 'churn'
6 và
Execution failed on sql 'select * from public.main_table
                                where dt = %[month_date]s 
                                and churn_date = %[churn]s
                                and connect_status IN [%[disco_target]s,'No Disco'] order by random[] limit 5000
                                ;': 'churn'
7 của bạn.

Đã trả lời ngày 12 tháng 11 năm 2018 lúc 6:25Nov 12, 2018 at 6:25

#Sử dụng con trăn này để viết truy vấn cập nhật động cho PostgreSQL

def updateQuery[self,tableName,setFields,setValues,whereFields,whereValues]:

    querySetfields = None
    queryWhereFields = None

    # Loop for set fields
    for i in range[len[setFields]]:
        if querySetfields is None:
            querySetfields=setFields[i]+"='"+setValues[i]+"'"
        else:
            querySetfields=querySetfields+","+setFields[i]+"='"+setValues[i]+"'"
    
    # Loop for whereFields
    for i in range[len[whereFields]]:
        if queryWhereFields is None:
            queryWhereFields=whereFields[i]+"='"+whereValues[i]+"'"
        else:
            queryWhereFields=queryWhereFields+","+whereFields[i]+"='"+whereValues[i]+"'"
    
    #Form the complete update query
    query="UPDATE "+tableName+" SET "+querySetfields+" WHERE "+queryWhereFields
    
    return query

Jeremy Caney

6.60548 Huy hiệu vàng45 Huy hiệu bạc70 Huy hiệu Đồng48 gold badges45 silver badges70 bronze badges

Đã trả lời ngày 28 tháng 8 lúc 6:25Aug 28 at 6:25

Dữ liệu là sản phẩm cao cấp của thế kỷ 21. Các doanh nghiệp tập trung vào dự trữ dữ liệu vì nhiều dữ liệu dẫn đến việc ra quyết định tỉ mỉ và tính toán và mở ra nhiều cánh cửa hơn để chuyển đổi kinh doanh. Tích lũy dữ liệu nặng đòi hỏi không gian lưu trữ quá mức và các tùy chọn phân tích và xử lý để ra quyết định thời gian thực. Các đơn vị cơ sở hạ tầng và lưu trữ trong nhà truyền thống không còn khả thi cho các yêu cầu dữ liệu lớn thời hiện đại. Các nhà cung cấp dịch vụ đám mây đang trang bị một loạt các giải pháp lưu trữ và tính toán theo yêu cầu theo yêu cầu, đáp ứng các yêu cầu dữ liệu lớn bằng cách loại bỏ chi phí cơ sở hạ tầng.

Rốt cuộc, chúng ta sống trong một thế giới nơi mọi thứ là thời gian thực. Nếu không có thiết kế kiến ​​trúc được tính toán, sự tăng sinh dữ liệu quá mức có thể dẫn đến một núi dữ liệu không thể quản lý. Với sự gia tăng lượng dữ liệu cần phân tích dữ liệu để rút ra những hiểu biết kinh doanh sẽ tăng vọt. Các doanh nghiệp không thể luôn luôn đủ khả năng để xử lý dữ liệu vào thời điểm sau đó, giả sử rằng họ sẽ đạt được giá trị kinh doanh tương tự.

Các yêu cầu phân tích theo thời gian thường làm cho chúng ta các đối số/giá trị mã hóa trong các truy vấn của chúng ta. Một thay đổi mã nhỏ trong một cơ sở mã phức tạp có thể dẫn đến các sản phẩm bị trì hoãn.

Để các tùy chọn tích hợp đơn giản và dễ dàng, hãy để sử dụng kho dữ liệu của Snowflake để minh họa cho vấn đề của chúng tôi. Ví dụ này có kế hoạch cho bạn thấy cách chúng tôi có thể tự động chuyển các giá trị cho các truy vấn SQL bằng cách sử dụng đầu nối Python Snowflake trong thời gian chạy để làm cho mã của chúng tôi linh hoạt và dễ quản lý hơn.

Bông tuyết là gì? Làm thế nào để cài đặt đầu nối tuyết?

Snowflake là kho dữ liệu hiện đại với lưu trữ theo yêu cầu, phân tích tinh vi và hoạt động cơ sở dữ liệu ở độ trễ nhanh chóng. Dưới đây là liên kết để cài đặt Trình kết nối tuyết: //docs.snowflake.com/en/user-guide/python-connect

Hãy để thẳng vào nó và cài đặt các thư viện dành riêng cho phiên bản đầu tiên cho đầu nối

pip install -r //raw.githubusercontent.com/snowflakedb/snowflake-connector-python/v2.7.6/tested_requirements/requirements_38.reqs

Bây giờ chạy PIP Cài đặt để cài đặt phiên bản mong muốn của đầu nối tuyết

pip install snowflake-connector-python==

Lưu ý: & NBSP; Trình kết nối Python cung cấp tích hợp để sử dụng tài liệu cài đặt thanh toán thư viện Pandas.the Python connector provides integration to use the pandas’ library checkout installation docs.

Cấu hình kết nối bông tuyết

Để bắt đầu truy vấn dữ liệu của chúng tôi, trước tiên, chúng tôi cần kết nối với kho dữ liệu đám mây. Trong trường hợp của chúng tôi, chúng tôi cần kết nối với bông tuyết. Để đảm bảo chúng tôi kết nối với cơ sở dữ liệu và truy vấn các bảng mong muốn bằng cách thiết lập một kết nối an toàn, Snowflake có một số hướng dẫn.
To ensure we are connecting to the database and querying desired tables by establishing a secure connection, snowflake has some guidelines.

4 trên 6 tham số được tìm thấy trên trang chủ của bông tuyết,

Tuyên bố kết nối sẽ tương đương với biến Python dưới đây. Vui lòng vượt qua các giá trị liên quan để thiết lập kết nối.
Please pass relevant values to establish a connection.

conn = snowflake.connect[
    user=sfUser,
    password=sfPwd,
    account=sf_account,
    warehouse=sf_warehouse,
    database=sf_database,
    schema=sf_schema
]

Bây giờ chúng tôi đã thiết lập một kết nối cơ sở dữ liệu thành công. Hãy để tuyên bố con trỏ của chúng tôi và bắt đầu truy vấn.

Xác định đối tượng con trỏ

Con trỏ là một thể hiện lớp Python được sử dụng rất nhiều để gọi các phương thức Python SQL để tìm nạp, truy vấn và sửa đổi các bảng.

Một con trỏ được tạo bằng cách gọi phương thức con trỏ [] của kết nối

cur = conn.cursor[]

Trong suốt vòng đời của một phiên, con trỏ được liên kết với các thông số kỹ thuật kết nối được cung cấp.

Gán truy vấn SQL cho biến Python

Kết nối con trỏ sẽ chấp nhận truy vấn SQL dưới dạng biến chuỗi Python.

query = 'select column1, column2 from ' 
            'test_table WHERE {0} = {1} '

Ở đây {0} và {1} là bộ nội suy chuỗi cho phép chúng tôi truyền các giá trị động trong thời gian chạy. Các giá trị động có thể được thay thế trực tiếp thành {0} và {1} bằng tên của chúng, chẳng hạn như {cột_name} và {value_holder}. Nhưng nó thường có lợi để tránh gọi theo cách tiếp cận tên.

Xác định cấu hình / giá trị động

Chúng tôi tuyên bố các giá trị động mà chúng tôi dự định chuyển cho các truy vấn SQL của chúng tôi trong thời gian chạy.

column_name = 'Site'
value_holder = 'Analytics_vidya'

Định dạng truy vấn SQL bằng cách sử dụng Python từ repr

repr [] là một hàm tích hợp python trả về một biểu diễn có thể in của một đối tượng được chỉ định.

Chúng tôi sẽ định dạng truy vấn và vượt qua các giá trị động của chúng tôi như là một phần của định dạng. Thứ tự của các đối số là tuần tự.

Phần tử đầu tiên sẽ ở Index 0, v.v.

Execution failed on sql 'select * from public.main_table
                                where dt = %[month_date]s 
                                and churn_date = %[churn]s
                                and connect_status IN [%[disco_target]s,'No Disco'] order by random[] limit 5000
                                ;': 'churn'
0

Thực hiện truy vấn cuối cùng

Đối tượng con trỏ cung cấp một phương thức để thực hiện các truy vấn được định dạng của chúng tôi như dưới đây.

Execution failed on sql 'select * from public.main_table
                                where dt = %[month_date]s 
                                and churn_date = %[churn]s
                                and connect_status IN [%[disco_target]s,'No Disco'] order by random[] limit 5000
                                ;': 'churn'
1

Phương thức thực thi sẽ sử dụng các chi tiết kết nối và tìm nạp các bản ghi từ bảng được chỉ định làm cho các điều kiện động.

Điểm cần lưu ý

1. Một truy vấn được thực thi nếu chúng ta chuyển nó một cách rõ ràng cho phương thức thực thi con trỏ.

Execution failed on sql 'select * from public.main_table
                                where dt = %[month_date]s 
                                and churn_date = %[churn]s
                                and connect_status IN [%[disco_target]s,'No Disco'] order by random[] limit 5000
                                ;': 'churn'
2

2. Chúng ta có thể sử dụng các cuộc gọi động này thông qua các câu lệnh có điều kiện. & NBSP;

Execution failed on sql 'select * from public.main_table
                                where dt = %[month_date]s 
                                and churn_date = %[churn]s
                                and connect_status IN [%[disco_target]s,'No Disco'] order by random[] limit 5000
                                ;': 'churn'
3

3. Chúng ta có thể chuyển các đối số phương thức/hàm dưới dạng giá trị động.

Def Dynamic_Method [Config_Parse, Cột_Name]:

in [kiểm tra biến động của "Biến động]]

Truy vấn = ‘Chọn cột1, cột2 từ‘

Test_table WHERE {0} = {1} ‘‘

Final_query = query.format [repr [config], repr [cột_name]]

4. Chúng ta có thể sử dụng lại các biến động trong nhiều câu lệnh SQL

5. Phương thức thực thi của con trỏ được trang bị các hoạt động khác như Close [], fetchall [], ExecuterMany [], v.v.

Ưu điểm của phương pháp này

  1. Cách tiếp cận này giúp giải quyết các cuộc tấn công tiêm SQL.
  2. Tái cấu trúc mã, khả năng tái sử dụng mã và khả năng bảo trì sẽ tăng lên
  3. Hỗ trợ ngôn ngữ lập trình: Kho dữ liệu đám mây như Snowflake và AWS Redshift cung cấp nhiều hỗ trợ ngôn ngữ lập trình như Python.

Kết luận cho các truy vấn SQL

Mặc dù xây dựng các ứng dụng sử dụng nhiều dữ liệu, đường ống dữ liệu và các công việc dữ liệu lớn, điều quan trọng là phải tập trung vào việc thiết kế hiệu quả các truy vấn và công việc của chúng tôi để đạt được bản chất động và xử lý các chuyển đổi dữ liệu của chúng tôi trên & NBSP;

Kho dữ liệu đám mây cung cấp phân bổ tài nguyên theo yêu cầu, tự động mở rộng, du hành thời gian để khôi phục dữ liệu và trực quan hóa với các tính năng sẵn có như chế độ xem vật chất, hương vị regex và các tùy chọn làm phẳng để giải quyết các hoạt động SQL phức tạp.

Với sự gia tăng của Python, giờ đây chúng tôi có tùy chọn tích hợp đầu nối Python cho nhiều công cụ cơ sở dữ liệu phổ biến như Postgres, Cassandra và nhà kho dữ liệu đám mây.

Động lực đằng sau bài đăng này là cho thấy người ta không cần phải chạy tìm kiếm thông qua toàn bộ cơ sở mã để tạo ra một thay đổi nhỏ. Động lực duy trì cấu hình và đối số riêng biệt và thực hiện chúng cho các vấn đề của bạn giúp giải quyết vô số vấn đề trong quá trình triển khai sản xuất.

Các phương tiện truyền thông được hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định của tác giả.

Làm cách nào để tạo một truy vấn SQL động trong Python?

Việc gán truy vấn SQL cho biến python ở đây {0} và {1} là các máy nội suy chuỗi cho phép chúng tôi truyền các giá trị động trong thời gian chạy. Các giá trị động có thể được thay thế trực tiếp thành {0} và {1} bằng tên của chúng, chẳng hạn như {cột_name} và {value_holder}. Nhưng nó thường có lợi để tránh gọi theo cách tiếp cận tên.Dynamic values can be substituted directly to {0} and {1} by their names, such as {column_name} and {value_holder}. But it is often beneficial to avoid call by name approach.

Làm cách nào để viết một truy vấn SQL động?

Làm thế nào để sử dụng SQL động ?..
- Bắt đầu bằng cách khai báo biến truy vấn và các biến bắt buộc khác ..
Khai báo @sql nvarchar [1000].
Khai báo @varable1 varchar [50].
Khai báo @varable2 varchar [50].
- Đặt các giá trị của các biến được khai báo nếu được yêu cầu ..
Đặt @biến1 = 'A'.
- Xác định biến truy vấn ..

Truy vấn SQL động là gì?

Dynamic SQL là một kỹ thuật lập trình cho phép bạn xây dựng các câu lệnh SQL một cách linh hoạt trong thời gian chạy. Bạn có thể tạo mục đích chung hơn, các ứng dụng linh hoạt bằng cách sử dụng SQL động vì toàn văn của câu lệnh SQL có thể không rõ khi biên dịch.a programming technique that enables you to build SQL statements dynamically at runtime. You can create more general purpose, flexible applications by using dynamic SQL because the full text of a SQL statement may be unknown at compilation.

Làm thế nào để bạn tạo một truy vấn SQL trong Python?

Dưới đây là những bước đơn giản để bắt đầu ...
Bước 1 - Nhập SQLite và gấu trúc.Để bắt đầu, chúng tôi sẽ cần nhập SQLite vào sổ ghi chép Jupyter của chúng tôi.....
Bước 2 - Kết nối cơ sở dữ liệu của bạn.....
Bước 3 - Đối tượng con trỏ.....
Bước 4 - Viết một truy vấn.....
Bước 5 - Truy vấn chạy.....
Bước 6 - Đóng kết nối của bạn.....
Bước 7 - Phần thưởng [tại sao Python với SQL?].

Bài Viết Liên Quan

Chủ Đề