Ugrás a fő tartalomra

How can use Django, PostgreSQL, psycopg2, database parameters and multiple database schemas together?

When you start learning Django, first you started to use ORM and don't care about SQL. When you have found a bit more difficult issue and it is impossible to solve with it than you have to move to use Django Manager.raw(). Then you will reach the point, you have to learn, how can you execute custom SQL directly. Without any magic.

How can you use PostgreSQL in Django?
Install psycopg2 python module.

How can you use multiple schemas in Django?
You can declare in two places what kind of schema want to use.
First, you can set up in settings.py and it can use with connections parameter. If you don't specify the connection's key, Django will be using the default database:

Example multiple database setup in settings.py:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'OPTIONS': {
            'options': '-c search_path=schema_nameA',
            'client_encoding': 'UTF8',
            },
        'NAME': 'dbname',
        'USER': 'username',
        'PASSWORD': '*****',
        'HOST': '192.168.1.10',
        'PORT': '5432'
    },
    'db1': {
        'ENGINE': 'django.db.backends.postgresql',
        'OPTIONS': {
            'options': '-c search_path=schema_nameB'}
,
        'NAME': 'dbname',
        'USER': 'username',
        'PASSWORD': '*****',
        'HOST': '92.168.1.10',
        'PORT': '5432',
    }
}
Then you can choose the right key of the connections in the models.py:
from django.db import connections
with connections['db1'].cursor() as cursor:
    # Your code here...
It's important you have to use the database alias (default, db1) not the schema name or database name.

Second, you can declare the schemas in the raw SQL directly:

from django.db import connection

def my_custom_sql(self):
    with connection.cursor() as cursor:
        cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
        cursor.execute("SELECT foo FROM schema.bar WHERE baz = %s", [self.baz])
        row = cursor.fetchone()

    return row
I tested, In every time the FROM schema.table declaration was stronger. It overwrites the specified connections key than you get the result. (What was declared in the SQL's FROM clause.)

If you try to use parameters %s, %('key')s to change the schema it is impossible because you get back every time the variable with an apostrophe. It will cause SQL error: schema names can't be parameters because parameters only replace _data_ and not _identifiers_.

What was the solution?
At the end, I just removed the additional schema declaration from my FROM clause and I used without declaration at all. I just choose the right database connection as a parameter with the connection function.
SELECT foo FROM schema.bar WHERE baz = %s
from django.db import connections
with connections['db1'].cursor() as cursor:
    # Your code here...
 If you have sub-queries with different schemas it will be work fine, don't have to care about the database connection, remember, RAW SQL schema declarations are every time stronger.


Megjegyzések

Népszerű bejegyzések ezen a blogon

BAOFENG Rádiók magyar használati utasítása és beállítása

Olvasd el a biztonsági és összeszerelési részt a cikk végén letölthető pdf-ben. Fontos, hogy ne tedd tönkre első bekapcsoláskor a készülékedet: Az antennát a felszerelése során ne a felső végénél fogva forgasd, hanem az alsó végét fogd a kezedbe. Ha külső antennát használsz a készülékhez bizonyosodj meg róla hogy az SWR értéke 1:1,5 körüli vagy alacsonyabb, mert különben az adó végtranzisztora tönkremegy. Az antennát ne tartsd a kezedben, ne csomagold be hogy elkerüld az adóvevő rendellenes működését. Soha ne kapcsold adásra a készüléket antenna nélkül. Mert tönkre megy:) Rádió részei antenna jelzőfény (elemlámpa) BE/KI kapcsoló és hangerőszabályozó gomb LCD kijelző CALL gomb Röviden rádió, hosszan riasztó vagy csörgető gomb MONI gomb röviden nyomva elemlámpa, hosszan pedig zajzár nyitás PTT (adás indítás) VFO/MR gomb ( frekvencia/csatorna mód) frekvencia szerint vagy csatorna szerint kereshetünk, ha már van beprogramozott csatorna jelzőled zöld adás vételeko

Magyar Telegram csoportok, csatornák

Talán találkoztak már a Telegrammal , majd legyintettetek, ez is olyan mint a többi (Instagram, WhatsApp, Viber, Messenger.) Elsőre én is így tettem, azt hittem sima üzenetküldésre jó. Amiben más, hogy nagyon jó kis közösségeket lehet építeni, jelenlegi maximum 100 000 fő. Egy közös nagy chat szobára hasonlít, ahova képeket, videókat fájlokat is lehet feltölteni. Sajnos nem minden csatornát lehet egyszerűen megtalálni, főleg nem kategorizált formában. Nemzetközi Telagram csoportokat, csatornákat sokkal könnyebb megtalálni, több is van belőlük. Magyar Telegram csoportokat, csatornákat viszont a számok törvénye miatt sokkal nehezebb volt eddig megtalálni. Kezd a nézelődést a következő oldallal: Magyar Telegram csoportok csatornák Telegram név: @magyargram Telegram hivatkozás (alkalmazás telepítése szükséges): https://t.me/magyargram Ha nem működne a hivatkozás, nem telepítetted még az alkalmazást! PC-re: letöltés Androidra:  letöltés Iphone-ra: letöltés Webe

Xiaomi telefonról rendszer alkalmazások törlése és reklámok eltávolítása

Nincs is bosszantóbb annál, mikor a MI Böngészőt erőlteti a telefon, vagy bármilyen más előre telepített programot. Xiaomi jó telefonokat gyárt, cserébe teleszórja reklámmal és mindenféle analitika küldő programmal, ami magánéletünket nem feltétlenül tiszteli. Ezeket a gyári programokat csak külső programmal lehet letörölni neve ADB-tool. nem kell hozzá root hozzáférés, így a telefonunk garanciája is megmarad. Ezen az oldalon összeszedték a listát, amit le lehet törölni, természetesen mindenki saját felelősségére tegye. Illetve törlés előtt letilthatja az alkalmazást, hogy kiderüljön, okoz-e galibát az eltávolítása. https://c.mi.com/thread-3676185-1-0.html https://rootmygalaxy.net/xiaomi-bloatware-list-remove-safely-from-miui/ https://technastic.com/xiaomi-bloatware-list-miui/ https://selivan.github.io/2020/02/25/removing-bloatware-from-xiaomi-miui-android.html Ezzel a progival pedig már el is kezdheted a törölgetést: https://github.com/Szaki/XiaomiADBFastbootTools https://www.xda-deve