使用sqlalchemy處理已有的數(shù)據(jù)庫

使用django搭建的網(wǎng)站,已經(jīng)在django的models中創(chuàng)建了模型,并且已經(jīng)有數(shù)據(jù)。
這里需要在后臺寫server處理后臺采集的數(shù)據(jù)。

使用automap_base獲取數(shù)據(jù)庫中已有的表

from sqlalchemy import create_engine
from sqlalchemy.ext.automap import automap_base


def get_database(host, db_name, user, password):
    """
    create existed postgre database engine and get its table with sqlalchemy

    :param host:host name, eg:'192.168.8.8'
    :param db_name: postgre database's name,eg:'mydatabase'
    :param user: postgre database user's name, eg: 'myname'
    :param password: postgre databse user's password
    :return: db_engine, database engine,can used by sqlalchemy or pandas
             tables, database's tables
    """
    db_type = "postgres"  # postgresql+psycopg2
    string = "%s://%s:%s@%s/%s" % (db_type, user, password, host, db_name)
    db_engine = create_engine(string, echo=False, client_encoding='utf8')
    # get sqlalchemy tables from database
    Base = automap_base()
    Base.prepare(db_engine, reflect=True)
    tables = Base.classes
    return db_engine, tables
  
db_engine, db_table = get_database(host, data_db, user)

db_table的類型為<class 'sqlalchemy.util._collections.Properties'>
,可以通過tables.數(shù)據(jù)庫表名來訪問數(shù)據(jù)庫表,比如該數(shù)據(jù)庫中有一個名為device的數(shù)據(jù)庫表,則訪問該表的方法為:tab_device = db_table.device或者tab_device = db_table['device']。

數(shù)據(jù)庫表數(shù)據(jù)操作

上面得到的數(shù)據(jù)庫表類實例可用于sqlalchemy的sql查詢和orm操作。

sql查詢

from sqlalchemy.sql import select
import pandas as pd

selector_device = select([tab_device]).where(tab_device.type_id == device_type)
df_device = pd.read_sql(selector_device, con=engine)

這里的selector_device的類型為:<class 'sqlalchemy.sql.selectable.Select'>
,該類型的查詢語句可供pandas的read_sql函數(shù)直接使用,將查詢結(jié)果轉(zhuǎn)換為pd.DataFrame格式。

orm查詢

from sqlalchemy.orm import sessionmaker


session = sessionmaker(bind=db_engine)()

query_device = session.query(tab_device).filter(tab_device.type_id == device_type)

這里的query_device的類型為<class 'sqlalchemy.orm.query.Query'>
,該類型的查詢語句無法供pandas的read_sql使用,原因在于pandas read_sql的sql輸入類型為 : string SQL query or SQLAlchemy Selectable (select or text object)to be executed, or database table name.

sql刪除

sqlalchemy sql expression官方教程得到的刪除方法應(yīng)該是這樣的:
tab_device.delete().where(...)
但是會報以下錯誤:
AttributeError: type object 'device' has no attribute 'delete'
sql還有與select相似的delete函數(shù),可以這樣引入:
from sqlalchemy.sql import delete
但是沒從官方教程看到相關(guān)文檔,源碼封裝的比較好,也沒找到,時間有限,先放棄。

orm刪除

orm刪除可以這樣實現(xiàn):

(Pdb) test = session.query(db_table.kindergarten_deviceinfo).filter(db_table.kindergarten_deviceinfo.type_id==100)
(Pdb) test.delete()

然后用session.commit()提交就可以了。
本來想只用sqlalchemy的sql或者orm,但是現(xiàn)在還不能完全實現(xiàn)功能,等有時間了,研究一下能否實現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容