Kaip paleisti neapdorotus SQL SQLAlchemy kolbos programoje

Kaip atlikti SQL užklausą SQLAlchemy?

Turiu „python“ žiniatinklio programą, kuri veikia kolboje ir sąsajos su duomenų baze per „SQLAlchemy“.

Man reikia būdų paleisti neapdorotą SQL. Prašyme pateikiamos kelios lentelės asociacijos kartu su „Inline“ vaizdais.

Bandžiau:

 connection = db.session.connection() connection.execute( <sql here> ) 

Bet visuomet gaunu gateway klaidas.

149
31 июля '13 в 16:39 2013-07-31 16:39 „Starwing123“ yra nustatytas liepos 31 d. 13 val. 4:39 2013-07-31 16:39
@ 7 atsakymai

Bandėte:

 result = db.engine.execute("<sql here>") 

arba

 from sqlalchemy import text sql = text('select name from penguins') result = db.engine.execute(sql) names = [row[0] for row in result] print names 
218
01 авг. atsakymas duotas Miguel 01 rug. 2013-08-01 10:32 '13, 10:32 2013-08-01 10:32

Jei norite naudoti sesiją (kaip paragino jūsų klausimas), naudokite jo execute metodą tiesiogiai:

 import sqlalchemy from sqlalchemy.orm import sessionmaker, scoped_session engine = sqlalchemy.create_engine('my connection string') Session = scoped_session(sessionmaker(bind=engine)) s = Session() result = s.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5}) 

Mano duomenų bazės tvarkyklė (psycopg2) gali pasakyti: aš nesu tikras. Nesvarbu, kaip ištraukiu savo vertybes.

 from collections import namedtuple Record = namedtuple('Record', result.keys()) records = [Record(*r) for r in result.fetchall()] for r in records: print(r) 

Raktas skambina fetchall() . Pavadinimas, kad mano gyvenimas palengvina, suteikdamas prieigą pagal vardą.

Be to, tai yra sandorio sudarymas be rankinio valdymo. Tarkime, make_session yra funkcija, kuri sukuria sesiją:

 >>> s1 = make_session() >>> s1.execute('CREATE TABLE blah (id INTEGER)') <sqlalchemy.engine.result.ResultProxy object at 0x02CD86F0> >>> s1.commit() >>> >>> s1.execute('INSERT INTO blah VALUES (1)') <sqlalchemy.engine.result.ResultProxy object at 0x02CD8870> >>> s1.execute('SELECT * FROM blah').fetchall() [(1,)] >>> >>> s2 = make_session() >>> s2.execute('SELECT * FROM blah').fetchall() [] >>> s2.close() >>> >>> s1.commit() >>> >>> s2 = make_session() >>> s2.execute('SELECT * FROM blah').fetchall() [(1,)] >>> s2.close() >>> s1.close() 
108
28 февр. atsakymas pateikiamas jpmc26 28 vasaris 2014-02-28 04:56 '14 at 4:56 2014-02-28 04:56
15 сент. Jake Berger atsakymas rugsėjo 15 d 2013-09-15 07:35 '13, 7:35 am 2013-09-15 07:35

SQL SELECT užklausų rezultatus galite gauti iš from_statement() ir text() , kaip parodyta čia . Tokiu būdu jums nereikia nagrinėti rinkinių. Pavyzdžiui, klasės vartotojui, turinčiam naudotojo vardą „tablename“, galite pabandyti,

 from sqlalchemy.sql import text . . . user = session.query(User).from_statement( text("SELECT * FROM users where name=:name")).\ params(name='ed').all() return user 
26
03 нояб. Atsakymą pateikė TrigonaMinima, lapkričio 3 d. 2014-11-03 15:39 '14 at 15:39 2014-11-03 15:39
 result = db.engine.execute(text("<sql here>")) 

atlieka <sql here> , bet neįsipareigoja, nebent esate automatinio pasirinkimo režime. Taigi, įterpimai ir atnaujinimai duomenų bazėje neatsispindi.

Jei norite pataisyti po pakeitimų, atlikite

 result = db.engine.execute(text("<sql here>").execution_options(autocommit=True)) 
11
03 сент. Atsakymas duotas Devi 03 rugsėjo. 2015-09-03 10:03 '15 , 10:03 2015-09-03 10:03

Tai supaprastintas atsakymas, kaip paleisti SQL užklausą iš „Flask Shell“.

Pirmiausia pažymėkite savo modulį (jei jūsų modulis / programa pagrindiniame aplanke yra answer.py ir esate UNIX operacinėje sistemoje), paleiskite:

 export FLASK_APP=manage 

Pradinė kolba

 flask shell 

Importuokite tai, ko mums reikia:

 from flask import Flask from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy(app) from sqlalchemy import text 

Paleiskite užklausą:

 result = db.engine.execute(text("<sql here>").execution_options(autocommit=True)) 

Jis naudoja dabartinį duomenų bazės ryšį, kurį turi programa.

0
26 янв. Luigi Lopez atsakymas . 2019-01-26 08:46 '19, 08:46 am 2019-01-26 08:46

Ar bandėte naudoti „ connection.execute(text( <sql here> ), <bind params here> ) ir susieti parametrus, kaip aprašyta dokumentuose ? Tai gali padėti išspręsti daugelį formatavimo ir našumo problemų. Galbūt vartai yra klaida? Įrišimo parinktys paprastai apsunkina sudėtingas užklausas.

0
01 авг. atsakymas duotas jhnwsk 01 rug . 2013-08-01 16:57 '13, 16:57, 2013-08-01 16:57