Saya memiliki skrip Python (3) yang seharusnya dijalankan setiap pagi. Di dalamnya, saya menyebut beberapa SQL. Namun saya mendapatkan pesan kesalahan:

Kesalahan saat menghubungkan ke operator PostgreSQL tidak ada: tanggal = integer

SQL didasarkan pada rangkaian string:

ecom_dashboard_query = """
with 
days_data as (
select 
    s.date,
    s.user_type,
    s.channel_grouping,
    s.device_category,
    sum(s.sessions) as sessions,
    count(distinct s.dimension2) as daily_users,
    sum(s.transactions) as transactions,
    sum(s.transaction_revenue) as revenue
from ga_flagship_ecom.sessions s
where date = """ + run.start_date + """
group by 1,2,3,4
)

insert into flagship_reporting.ecom_dashboard
select *
from days_data;
"""

Inilah kesalahan lengkapnya:

09:31:25  Error while connecting to PostgreSQL  operator does not exist: date = integer
09:31:25  LINE 14: where date = 2020-01-19
09:31:25                      ^
09:31:25  HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.

Saya mencoba membungkus run.start_date dalam str seperti: str(run.start_date) tetapi saya menerima pesan kesalahan yang sama.

Saya menduga ini mungkin berkaitan dengan cara saya menggabungkan string kueri SQL, tetapi saya tidak yakin.

Kueri berjalan dengan baik dalam SQL secara langsung dengan tanggal kode keras dan tanpa penggabungan:

where date = '2020-01-19'

Bagaimana saya bisa membuat string kueri berfungsi dengan benar?

0
Doug Fir 22 Januari 2020, 17:36

2 jawaban

Jawaban Terbaik

Lebih baik meneruskan parameter kueri ke metode cursor.execute. Dari dokumen

Peringatan Jangan pernah, jangan pernah, JANGAN PERNAH menggunakan rangkaian string Python (+) atau interpolasi parameter string (%) untuk meneruskan variabel ke string kueri SQL. Bahkan tidak dengan todongan senjata.

Jadi alih-alih penggabungan string, berikan run.start_date sebagai argumen kedua cursor.execute.

Dalam kueri Anda alih-alih penggabungan gunakan %s:

where date = %s
group by 1,2,3,4

Dalam kode python Anda, tambahkan argumen kedua ke metode execute:

cur.execute(ecom_dashboard_query , (run.start_date,))
2
neverwalkaloner 22 Januari 2020, 14:45

Kalimat Anda salah:

Di mana tanggal = """ + run.start_date + """

Coba bandingkan tanggal dan string dan ini tidak mungkin, Anda perlu mengonversi "run.start_date" ke datetime dan bandingkan secara sederhana:

date_format = datetime.strptime(your_date_string, '%y-%m-%d')

Dan dengan tanggal ini dikonversi ke datetime lakukan:

where date = date_format

Kode akhir:

date_format = datetime.strptime(your_date_string, '%y-%m-%d')
ecom_dashboard_query = """
with 
days_data as (
select 
    s.date,
    s.user_type,
    s.channel_grouping,
    s.device_category,
    sum(s.sessions) as sessions,
    count(distinct s.dimension2) as daily_users,
    sum(s.transactions) as transactions,
    sum(s.transaction_revenue) as revenue
from ga_flagship_ecom.sessions s
where date = {}
group by 1,2,3,4
)

insert into flagship_reporting.ecom_dashboard
select *
from days_data;
""".format(date_format)
1
Pablo 22 Januari 2020, 15:00