🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.python
Article #27149

Re: Python i MySQL BLOB

#27149
From: Daniel Mróz
Date: Tue, 05 Jan 2010 18:23
46 lines
3572 bytes
On 05.01.2010, Jacek Czerwinski <x@y.z.pl> wrote:
>>>>>> pick = pickle.dumps("alamakota")
>>>>>> cur.execute("INSERT INTO test VALUES(10, %s, 3);", (pick,))
>>>>> A gdybym chciała zrobić coś w stylu:
>>>>> cur.execute("INSERT INTO %s VALUES(10, %s, 3);", (nazwa_tabeli,pick))
>>>>> to ten sposób znowu zawodzi i pojawia się błąd podobny do poprzedniego. 
>>>> cur.execute("""INSERT INTO %s VALUES(10, %%s, 3)""" % nazwa_tabeli, (pick,))
>>>> nie zadziała?
>>> Na dwoje babka wróżyła. W surowych SQL-ach odpowiednik czyli podać 
>>> argumenty i prepare bywa zakazane (podobno ze względu na niewykonalnośc 
>>> prepare). Ale tak sobie gadam.
>> Nie rozumiem o co chodzi w powyższej wypowiedzi (nie piłem jeszcze kawy), 
> Zasłyszane, stare, nie będę się upierał, i w ogóle skleroza, ale jakoby 
> W TYM MIEJSCU (tj nazwy tabeli) nie można było parametryzować.
Hmmm? Chyba chodzi Ci o to, że nie powinno się robić czegoś takiego:

cur.execute("""INSERT INTO blah(foo, bar) VALUES('%s', %s)""" % (Str, Int))

ale my tu tego nie robimy. Dane do wstawienia przekazywane są do
metody cur.execute(), a nie podstawiane. Podstawieniu ulega jedynie
nazwa tabeli, której nie idzie inaczej wstawić, gdyż po przekazaniu
metoda uzna nazwę tabeli za string i zamknie ją w ciapkach.
Pomijając już dyskusyjność pomysłu parametryzowania nazw tabel,
trzeba pamiętać aby w zmiennej "nazwa_tabeli" nie wylądowały np.
jakieś średniki. Odpowiednim przygotowaniem zwartości zmiennej
może się zająć funkcja, która wszelkie drażliwe znaki usunie, lub
zastąpi innymi (bądź sekwencjami). Nadal jest to jednak zły pomysł.
Nazwy tabel powinny w zapytaniach SQL być zawsze podawane jawnie.
Jeśli nazwa tabeli jest brana z zewnętrznego źródła (np. z danych
od użytkownika), to powinno się poważnie przemyśleć to co się robi
i jak najszybciej to zmienić. Jeśli natomiast robi się to z czystego
lenistwa ("nie chce mi się zmieniać fafdziesięciu zapytań SQL jak
zmieni się nazwa tabeli"), to powinno się poczytać dokumentację
swojego IDE lub programu sed.
Inne przypadki jakoś mi nie przychodzą na myśl, ale mam zbyt dużą
zawartość krwi w kofeinie.


Pozdrawiam
Beorn

-- 
Daniel 'Beorn' Mróz <beorn@alpha.pl>    http://127.0.0.1/beorn
[GIT d s:- a-@ C++++ UL++++$ P+ L++++ E--- W+ N+++ o? K- w---]
[O- M- V!  PS+ PE++ Y+ PGP++ t- 5  X R !tv b+ DI D++ G++ e h*]
[                          r++  y+                           ]
Technical Details
Message-ID: <slrnhk72fq.708.beorn@pino.cyberdeck.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!nf1.ipartners.pl!ipartners.pl!news.nask.pl!news.nask.org.pl!newsfeed.atman.pl!not-for-mail
References: <hhvlil$cso$1@achot.icm.edu.pl> <e40b5499-a692-4d1d-bd6d-8dd80f5ae900@c3g2000yqd.googlegroups.com> <hhvp29$gld$1@achot.icm.edu.pl> <slrnhk6q4e.6d2.beorn@pino.cyberdeck.pl> <hhvrc6$6fe$1@news.onet.pl> <slrnhk70lt.6v8.beorn@pino.cyberdeck.pl> <hi00a7$l52$1@news.onet.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!nf1.ipartners.pl!ipartners.pl!news.nask.pl!news.nask.org.pl!newsfeed.atman.pl!not-for-mail
From: Daniel Mróz <beorn@alpha.pl>
Newsgroups: pl.comp.lang.python
Subject: Re: Python i MySQL BLOB
Date: Tue, 5 Jan 2010 18:23:12 +0000 (UTC)
Organization: A tak se walimy młotkami d:-/
Lines: 46
Message-ID: <slrnhk72fq.708.beorn@pino.cyberdeck.pl>
References: <hhvlil$cso$1@achot.icm.edu.pl> <e40b5499-a692-4d1d-bd6d-8dd80f5ae900@c3g2000yqd.googlegroups.com> <hhvp29$gld$1@achot.icm.edu.pl> <slrnhk6q4e.6d2.beorn@pino.cyberdeck.pl> <hhvrc6$6fe$1@news.onet.pl> <slrnhk70lt.6v8.beorn@pino.cyberdeck.pl> <hi00a7$l52$1@news.onet.pl>
NNTP-Posting-Host: fw2.itvp.pl
Mime-Version: 1.0
X-Trace: node1.news.atman.pl 1262715792 3351 217.17.39.4 (5 Jan 2010 18:23:12 GMT)
X-Complaints-To: usenet@atman.pl
NNTP-Posting-Date: Tue, 5 Jan 2010 18:23:12 +0000 (UTC)
User-Agent: slrn/0.9.8.1pl2.1 (Linux)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit