Django ve SQLAlchemy birlikte kullanılabilir mi?

backend     | /usr/local/lib/python3.8/site-packages/pandas/io/sql.py:762: UserWarning: pandas only support SQLAlchemy connectable(engine/connection) ordatabase string URI or sqlite3 DBAPI2 connectionother DBAPI2 objects are not tested, please consider using SQLAlchemy

django da harici veritabanı mssql e bağlanıp veri çekiyorum. Veri beklediğim şekilde geliyor. ancak yukarıdaki uyarıyı alıyorum. SQLAlchemy ile ilgili tek bilgim django orm’nin flask versiyonu olduğu yönünde. ne yapmalıyım tavsiyesi olan var mıdır?

class Datum(models.Model):
    title = models.CharField(max_length=56)
    connector = models.ForeignKey(ExternalDbConnector, on_delete=models.CASCADE)
    query = models.ForeignKey(Query, on_delete=models.CASCADE)

    @property
    def data(self):
        with self.connector.connector() as conn:
            sql = self.query.text
        return pd.read_sql(sql, conn)

self.query.text > sql sorgusu string
self.connector.connector() > şöyle bir şey

    def connector(self):
        return pyodbc.connect(DRIVER={ODBC Driver 17 for SQL Server};SERVER=0.0.0.000;DATABASE=**;UID=**;PWD=**;)

Bu pek doğru değil. flask-sqlalchemy için bu ifade daha doğru olabilir.

Konuya gelecek olursak Pandas ile herhangi bir bağlanıcı kütüphane ile (pyodbc, cx_Oracle, psycopg2) üzerinden sorgu yürütüp dönen tabloyu dataframe içerisine alabiliyorsunuz, ama bu connector Sqlalchemy değilse Pandas yukarıdaki uyarıyı veriyor. Oracle ve Mssql üzerinde hâlâ kullanıp aynı uyarıyı alıyorum ama uyarı haricinde şimdiye değin ben bir sıkıntısını görmedim. Uyarıyı da görmeyeyim derseniz:

kısmını sqlalchemy ile de yazabilirsiniz. Çünkü SqlAlchemy de veri tabanlarına bağlanmak için driver olarak bu kütüphaneleri kullanıyor. Genel yapı şu şekilde:

dialect+driver://username:password@host:port/database

ama ben ODBC driver tanımlarken bayağı tırmalamıştım. onu da aşağıdaki gibi sonuna ekleyebilirsiniz:

connection_string= f"mssql+pyodbc://{usr}:{pwd}@{server}/{db}?driver=ODBC Driver 17 for SQL Server"

Bundan sonra engine oluşturup onun üzerinden bağlanarak sorgulama yapabilirsiniz.

1 Beğeni

teşekkürler.

diğer konulara odaklanacağım için şimdilik bu şekilde bırakacağım; ama SQLAlchemy ile engine üzerinden kullanmak olası farklı kütüphaneleri benzeştirmek açısından mantıklı göründü.

1 Beğeni

Uyarılardan sıkılıp sqlalchemy ye çevirdim. son hali de şöyle koyayım. Belki biri aratır bulursa sonucu niye koymadın diye sövmesin. :stuck_out_tongue:

kullandığım sürüm: SQLAlchemy==2.0.* (sürüm önemli çoğu yerde 2,0 öncesi için çözüm var.)

class DatumDb(Datum):
    connector = models.ForeignKey(ExternalDbConnector, on_delete=models.CASCADE)
    query = models.ForeignKey(Query, on_delete=models.CASCADE)

    @property
    def data(self):
        with self.connector.engine.connect() as conn:
            query = self.query.text
            return pd.read_sql(query, conn)
from sqlalchemy import create_engine

class ExternalDbConnector(models.Model):
    ...
    @property
    def engine(self):
        if self.rdms == "MSSQL":
            text = f"mssql+pyodbc://{self.uid}:{self.pwd}@{self.server}/{self.database}?driver={self.driver}"
            return create_engine(text)
        else:
            raise ValueError("Invalid RDMS selection.")
from sqlalchemy import text

class Query(models.Model):
    ...
    @property
    def text(self) -> str:
        result = "SELECT "
        ...
        return text(result)

benzer bi sorunu ben de yaşamıştım. 2.0 sonrası sürümler için denediniz mi acaba çalışıyor mu?

2.0.9 için çalışıyor. https://www.sqlalchemy.org/ adresinde gördüğüm kadarıyla en güncel sürüm de bu.