У світі веб-розробки робота з базами даних є однією з ключових складових роботи. Для підключення до баз даних та взаємодії з ними використовуються різноманітні інструменти та бібліотеки. У контексті роботи з Django, однією з найпоширеніших бібліотек для цього є mssql-django
. Однак, іноді користувачам може знадобитися взаємодія з базою даних на більш низькому рівні, наприклад, працювати з рядками бази даних, а не просто отримувати кортежі значень.
У цій статті ми розглянемо використання бібліотек pyodbc
та mssql-django
для роботи з рядками в Django. Ми розглянемо різницю у роботі з рядками бази даних, коли використовується звичайний підключений курсор та коли використовується Django ORM разом із mssql-django
.
pyodbc
– це Python-модуль, який надає простий спосіб підключення до різних баз даних з використанням ODBC (Open Database Connectivity). Основна його перевага полягає в тому, що він дозволяє працювати з базами даних, які підтримують ODBC, такі як Microsoft SQL Server, PostgreSQL, MySQL, і багатьма іншими.
Перш ніж почати використовувати pyodbc
, необхідно встановити його через pip:
1 |
pip install pyodbc |
Далі, для підключення до бази даних можна скористатися наступним кодом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import pyodbc SERVER = '' DATABASE = '' USERNAME = '' PASSWORD = '' connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={SERVER};DATABASE={DATABASE};UID={USERNAME};PWD={PASSWORD}' connection = pyodbc.connect(connectionString) SQL_QUERY = "SELECT * FROM fund_performance" cursor = connection.cursor() cursor.execute(SQL_QUERY) records = cursor.fetchall() for r in records: print(type(r)) print(f"{r.fund}\t{r.nav}") |
У цьому прикладі ми підключаємося до бази даних SQL Server за допомогою pyodbc
, виконуємо SQL-запит і отримуємо результат у вигляді кортежів. Однак, коли ми спробуємо виконати аналогічний код у додатку Django, отриманий тип рядка буде відрізнятися.
mssql-django
– це додатковий драйвер для Django, який дозволяє підключатися до баз даних Microsoft SQL Server. Він реалізує звичайний Django ORM для взаємодії з базою даних, але при цьому використовує pyodbc
під капотом для забезпечення зв’язку з базою даних через ODBC.
Для встановлення mssql-django
виконайте наступну команду:
1 |
pip install django-mssql-backend |
Після встановлення, вам необхідно налаштувати параметри підключення до бази даних в файлі settings.py
вашого Django-проекту:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
DATABASES = { 'default': { 'ENGINE': 'mssql', 'NAME': 'name', 'USER': 'user', 'PASSWORD': 'pass', 'HOST': 'db.database.windows.net', 'PORT': '1433', 'OPTIONS': { 'driver': 'ODBC Driver 18 for SQL Server', }, }, } |
Після налаштування підключення до бази даних у файлі settings.py
, Django буде використовувати mssql-django
для зв’язку з базою даних Microsoft SQL Server. Проте, коли ми виконуємо запити до бази даних і отримуємо результат, ми знову отримуємо кортежі значень, а не рядки з назвами полів.
У зв’язку з тим, що як використовується pyodbc
, так і mssql-django
повертають результати у вигляді кортежів, а не об’єктів рядків, нам необхідно знайти інший спосіб отримання рядків з назвами полів.
Один із можливих підходів – це перетворення кортежів в об’єкти, які мають атрибути з назвами полів. Це можна зробити шляхом створення класу-моделі в Django, який відображає структуру рядків у базі даних. Наприклад:
1 2 3 4 |
from django.db import models class FundPerformance(models.Model): fund = models.CharField(max_length=100) nav = models.DecimalField(max_digits=10, decimal_places=2) |
Після того, як ми визначили модель, можемо використовувати її для отримання результатів запитів у вигляді об’єктів з назвами полів:
1 2 3 4 |
records = FundPerformance.objects.raw("SELECT * FROM fund_performance") for r in records: print(type(r)) print(f"{r.fund}\t{r.nav}") |
У цьому прикладі ми використовуємо Django ORM для виконання запиту до бази даних і отримання результатів у вигляді об’єктів моделі FundPerformance
. Кожен об’єкт має атрибути з назвами полів, що дозволяє зручно працювати з отриманими даними.
Отже, використання pyodbc
та mssql-django
для роботи з рядками в Django можливе, але для отримання рядків з назвами полів потрібно використовувати Django ORM та визначення моделей.