- Vaša košarica je trenutno prazna
Python aplikacija in MySQL (MariaDB): SQLAlchemy, SQLite in oddaljen dostop
Skoraj vsaka spletna aplikacija hrani podatke v bazi. Aplikacije, ki jih pripravite z AI asistentom, privzeto pogosto uporabljajo SQLite, za objavo pa se postavi vprašanje, ali je bolje uporabiti MySQL. V tem prispevku boste izvedeli, kako Python aplikacijo na našem gostovanju povezati z bazo in na kaj morate paziti.
Na naših paketih je na voljo MariaDB, ki je v celoti združljiva z MySQL. Za Python uporabljate iste pakete in iste ukaze kot za MySQL. Na paketih Zeleni in višjih je na voljo tudi PostgreSQL.
Kazalo
- SQLite ali MySQL?
- 1. korak: ustvarite bazo in uporabnika
- 2. korak: namestite paket PyMySQL
- 3. korak: povezava s SQLAlchemy
- Omejitve
- Oddaljen dostop do baze
- PostgreSQL
- Pogoste napake
SQLite ali MySQL?
| SQLite | MySQL / MariaDB | |
|---|---|---|
| Nastavitev | brez, baza je ena datoteka | baza in uporabnik v cPanel |
| Primerno za | manjše aplikacije, prototipe, malo hkratnih zapisov | aplikacije z več uporabniki in več podatki |
| Varnostne kopije | datoteka je del vaših datotek | baza je vključena v varnostne kopije gostovanja |
| Upravljanje | orodja za SQLite | phpMyAdmin v cPanel |
SQLite na našem gostovanju deluje brez težav tudi pri več hkratnih zahtevkih. Datoteko baze hranite v mapi aplikacije (izven public_html) in nastavite čas čakanja:
import os
from sqlalchemy import create_engine
DB_PATH = os.path.join(os.path.dirname(__file__), "app.sqlite3")
engine = create_engine(f"sqlite:///{DB_PATH}", connect_args={"timeout": 15})
1. korak: ustvarite bazo in uporabnika
V cPanel odprite MySQL Databases (ali Manage My Databases):
- Ustvarite novo bazo, npr.
uporabnik_mojaapi. - Ustvarite uporabnika z močnim geslom.
- Uporabnika dodajte k bazi in mu dodelite pravice ALL PRIVILEGES.
Imena baz in uporabnikov imajo predpono, ki je enaka imenu vašega računa.
2. korak: namestite paket PyMySQL
V virtualnem okolju aplikacije namestite paket PyMySQL:
pip install pymysql
PyMySQL je napisan v celoti v Pythonu in se namesti brez prevajanja. Če vaš requirements.txt vsebuje paket mysqlclient in namestitev ne uspe (napaka rpm: command not found), ga zamenjajte s PyMySQL ali ga namestite z naslednjim ukazom:
MYSQLCLIENT_CFLAGS="$(mysql_config --cflags)" MYSQLCLIENT_LDFLAGS="$(mysql_config --libs)" pip install mysqlclient
3. korak: povezava s SQLAlchemy
Podatke za povezavo shranite v datoteko .env v mapi aplikacije (ne v public_html in ne v kodo, ki jo objavite na GitHub):
DATABASE_URL=mysql+pymysql://uporabnik_mojaapi:geslo@localhost/uporabnik_mojaapi?charset=utf8mb4
Datoteki nastavite pravice 600, da jo lahko bere samo vaš uporabnik.
V aplikaciji (paket python-dotenv):
import os
from dotenv import load_dotenv
from sqlalchemy import create_engine
load_dotenv(os.path.join(os.path.dirname(__file__), ".env"))
engine = create_engine(
os.environ["DATABASE_URL"],
pool_pre_ping=True, # preveri povezavo pred uporabo
pool_recycle=170, # obnovi povezave pred iztekom
)
Nastavitvi pool_pre_ping in pool_recycle sta pomembni. Strežnik zapre povezavo, ki 3 minute ni bila uporabljena. Brez teh nastavitev bo aplikacija po premoru občasno vrnila napako »MySQL server has gone away« oziroma »Lost connection to MySQL server«.
Če uporabljate Django, v settings.py nastavite ENGINE na django.db.backends.mysql, na začetku datoteke pa dodajte:
import pymysql
pymysql.install_as_MySQLdb()
Selitev s SQLite na MySQL
Če ste aplikacijo razvili s SQLite in uporabljate SQLAlchemy ali Django ORM, običajno zadošča sprememba povezovalnega niza. Tabele ustvarite z Base.metadata.create_all(engine) (SQLAlchemy) oziroma python manage.py migrate (Django). Podatke prenesete z izvozom in uvozom (npr. python manage.py dumpdata in loaddata).
Omejitve
Pri uporabi podatkovnih baz na spletnem gostovanju upoštevajte naslednje omejitve:
- Velikost posamezne baze je omejena (npr. 2 GB pri paketih Zeleni, Modri in Rdeči, 10 GB pri paketih Turbo gostovanja). Podrobnosti so v pogojih uporabe.
- Število hkratnih povezav z bazo je omejeno (npr. 50 pri paketu Zeleni). SQLAlchemy privzeto odpre največ 15 povezav na proces, zato pri več procesih nastavite manjši bazen:
create_engine(..., pool_size=3, max_overflow=2).
Oddaljen dostop do baze
Do baze lahko dostopate tudi z drugega strežnika ali svojega računalnika, na primer, ko zaledje vaše aplikacije teče drugje ali ko želite bazo upravljati z orodjem, kot je DBeaver ali MySQL Workbench.
- V cPanel odprite Remote MySQL.
- Dodajte javni IP naslov strežnika ali računalnika, s katerega se boste povezovali.
- Kot strežnik baze uporabite ime strežnika vašega gostovanja (najdete ga v cPanel), vrata
3306.
Povezava je šifrirana (TLS 1.3). Certifikat strežnika baze je samopodpisan, zato mora biti odjemalec nastavljen tako, da certifikata ne preverja. PyMySQL od različice 1.2 naprej povezavo samodejno šifrira (preverjeno), starejše različice pa ne, zato v requirements.txt zapišite pymysql>=1.2. Nameščeno različico preverite s pip show pymysql.
Nasveti
- Dodajte samo IP naslove, ki jih res potrebujete, in jih odstranite, ko jih ne potrebujete več.
- Za aplikacijo, ki teče na drugem strežniku, je vsak klic do baze počasnejši zaradi omrežne razdalje. Kadar je mogoče, naj aplikacija teče na istem paketu kot baza.
- Če potrebujete preverjen certifikat ali posebne nastavitve baze, priporočamo VPS strežnik.
PostgreSQL
Če vaša aplikacija uporablja PostgreSQL, bazo in uporabnika ustvarite v cPanel pod PostgreSQL Databases (na voljo od paketa Zeleni naprej). V virtualnem okolju namestite gonilnik, ki se namesti brez prevajanja:
pip install "psycopg[binary]"
Povezovalni niz v .env:
DATABASE_URL=postgresql+psycopg://uporabnik_mojaapi:geslo@localhost/uporabnik_mojaapi
Uporabite enake nastavitve kot pri MySQL (pool_pre_ping=True) in majhen bazen povezav (pool_size=2), saj si strežnik število povezav deli med vse uporabnike. Bazo upravljate z orodjem phpPgAdmin v cPanel.
Do baze lahko dostopa samo aplikacija na vašem paketu; oddaljen dostop (kot Remote MySQL) ni mogoč.
Na novejših strežnikih teče PostgreSQL 16, na starejših PostgreSQL 13. Različico vidite v phpPgAdmin ali z ukazom psql --version. Trenutne različice Djanga (5.2 in novejše) potrebujejo PostgreSQL 14 ali novejši, zato na strežniku s PostgreSQL 13 za Django uporabite MariaDB (MySQL).
Django s PostgreSQL 16 smo preizkusili (Django 6.1). V settings.py nastavite ENGINE na django.db.backends.postgresql, HOST na localhost, priporočamo pa še CONN_MAX_AGE = 60 in CONN_HEALTH_CHECKS = True.
Ko spremenite podatke v .env, aplikacijo ponovno zaženite (RESTART v Setup Python App). Do takrat lahko obstoječi procesi še uporabljajo stare podatke za povezavo.
Pogoste napake
Pri povezovanju Python aplikacije s podatkovno bazo lahko naletite na naslednje napake:
Access denied for user: preverite ime uporabnika in baze (s predpono), geslo ter ali ima uporabnik pravice na bazi.MySQL server has gone away/Lost connection: povezava je bila predolgo neaktivna. Uporabitepool_pre_ping=Trueali za vsak zahtevek odprite novo povezavo.Too many connections: zmanjšajtepool_sizein povezave po uporabi zaprite.- Napake ob uvozu aplikacije: povezave z bazo ne odpirajte in poizvedb ne izvajajte ob uvozu datoteke
passenger_wsgi.py, ampak šele v funkcijah, ki obdelajo zahtevek. Strežnik aplikacijo naloži enkrat in nato zažene več procesov, ki si sicer delijo isto povezavo. - Namestitev
mysqlclientne uspe (Failed to build 'mysqlclient'): uporabite PyMySQL. Programi, ki pričakujejomysqlclient(npr. Django), delujejo s PyMySQL, če na začetku dodateimport pymysqlinpymysql.install_as_MySQLdb(). - Aplikacija vrne napako 500: podrobnosti so v datoteki
stderr.logv mapi aplikacije.
Če potrebujete pomoč pri povezavi aplikacije z bazo, smo vam na voljo.
KOMENTIRAJTE OBJAVO
Vaš komentar je bil uspešno oddan
Komentar bo viden na strani, ko ga naši moderatorji potrdijo.