1. 程式人生 > >SQLAlchemy 連線 MySQL 資料庫(一)

SQLAlchemy 連線 MySQL 資料庫(一)

一、ORM介紹

ORM 全稱 Object Relational Mapping, 翻譯過來叫物件關係對映。簡單的說,ORM 將資料庫中的表與面嚮物件語言中的類建立了一種對應關係。這樣,我們要操作資料庫,資料庫中的表或者表中的一條記錄就可以直接通過操作類或者類例項來完成。ORM 相當於把資料庫也給你例項化了,在程式碼操作MySQL中級又加了orm這一層。

ORM的優點:

  • 隱藏了資料訪問細節,使得我們的通用資料庫互動變得簡單易行,並且完全不用考慮SQL語句
  • ORM使我們構造固化資料結構變得簡單易行

二、sqlalchemy安裝

SQLAlchemy 是Python 社群最知名的 ORM 工具之一,為高效和高效能的資料庫訪問設計,實現了完整的企業級持久模型。

在windows下通過pip安裝SQLAlchemy(這裡我們使用的是python3.5):

pipinstallsqlalchemy pip install pymysql
#由於mysqldb依然不支援py3,所以這裡我們用pymysql與sqlalchemy互動

三、連線與建立

在命令列下輸入下面命令啟動 MySQL:

$ mysql -uroot -p

然後建立資料庫blog:

> create database blog;

1.連線資料庫

新建個 Python 檔案 db_link_test.py ,

# coding: utf-8
from sqlalchemy import create_engine # 建立例項,並連線blog庫 engine = create_engine('mysql+pymysql://root:[email protected]:3306/blog?charset=utf8') print(engine)

然後執行程式,如果輸出下面資訊,即說明連線成功。

Engine(mysql+pymysql://root:*@localhost:3306/blog?charset=utf8)

2.描述表結構

要使用 ORM, 我們需要將資料表的結構用 ORM 的語言描述出來,我們以一個users表為例,

# coding: utf-8
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer

engine = create_engine('mysql+pymysql://root:[email protected]:3306/blog?charset=utf8')
Base = declarative_base()

class User(Base):
    # __tablename__ 指定在 MySQL 中表的名字
    __tablename__ = 'users'
    # Column 代表資料庫中的一列
    id = Column(Integer, primary_key=True)
    username = Column(String(64), nullable=False, index=True)
    password = Column(String(64), nullable=False)
    email = Column(String(64), nullable=False, index=True)

    def __repr__(self):
        return '%s(%r)' % (self.__class__.__name__, self.username)
  • __tablename__ 指定在 MySQL 中表的名字,
  • Column 代表資料庫中的一列,
  • nullable=False 代表這一列不可以為空,index=True 表示在該列建立索引。

四、關係定義

1、一對多關係

對於一個普通的部落格應用來說,使用者和文章顯然是一個一對多的關係,一篇文章屬於一個使用者,一個使用者可以寫很多篇文章,那麼他們之間的關係可以這樣定義:

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    username = Column(String(64), nullable=False, index=True)
    password = Column(String(64), nullable=False)
    email = Column(String(64), nullable=False, index=True)
    # 一對多:
    articles = relationship('Article')

class Article(Base):
    __tablename__ = 'articles'
    id = Column( Integer, primary_key =True )
    title = Column( String(255) , nullable=False , index = True )
    content = Column(Text)
    # “多”的一方的 articles 表是通過外來鍵關聯到 users 表的:
    user_id = Column(Integer,ForeignKey('users.id'))
    author = relationship('User')

說明:(1).每篇文章有一個外來鍵指向 users 表中的主鍵 id, 而在 User 中使用 SQLAlchemy 提供的 relationship 描述 關係。而使用者與文章的之間的這個關係是雙向的,所以我們看到上面的兩張表中都定義了 relationship。
SQLAlchemy 提供了 backref 讓我們可以只需要定義一個關係:

articles = relationship(‘Article’, backref=’author’)

添加了這個就可以不用再在 Article 中定義 relationship 了!所以上面也可以這麼寫:

class User(Base):
    ...
    articles = relationship('Article' , backref='author')

class Article(Base):
    ...

(2).通過relationship中的backref欄位反向查出所有它在User表裡的關聯項資料.

def Query2(session):
    print(session.query(Article).get(1) )
    print(session.query(Article).get(1).author )

此處session指會話,後面再提,第一句是查詢articles表中的第一行,第二句是通過找到articles表中的第一行中的外來鍵user_id欄位,再根據這個欄位數字找到users表中id所在行。

圖示:articles表
這裡寫圖片描述
users表:
這裡寫圖片描述
輸出結果如下:

Article(‘Tempore cumque esse sed.’)
User(‘Carmen Valencia’)

2、一對一關係

在 User 中我們只定義了幾個必須的欄位, 但通常使用者還有很多其他資訊,但這些資訊可能不是必須填寫的,我們可以把它們放到另一張 UserInfo 表中,這樣 User 和 UserInfo 就形成了一對一的關係。你可能會奇怪一對一關係為什麼不在一對多關係前面?那是因為一對一關係是基於一對多定義的,定義方法和一對多相同,只是需要新增 userlist=False 。

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    username = Column(String(64), nullable=False, index=True)
    password = Column(String(64), nullable=False)
    email    = Column(String(64), nullable=False, index=True)
    articles = relationship('Article' , backref='author')
    userinfo = relationship('UserInfo',backref='user',uselist=False)

class UserInfo(Base):
    __tablename__ = 'userinfos'
    id = Column(Integer, primary_key =True)
    name = Column( String(64))
    qq = Column(String(11))
    phone=Column(String(11))
    link=Column(String(64))
    user_id = Column(Integer,ForeignKey('users.id'))

3、多對多關係

一遍部落格通常有一個分類,好幾個標籤。標籤與部落格之間就是一個多對多的關係。多對多關係不能直接定義,需要分解成倆個一對多的關係,為此,需要一張額外的表 (即article_tag) 來協助完成:

# 中間表 自己建立。不需要手動管理,orm自動維護
article_tag = Table(
    'article_tag',Base.metadata,
    Column('article_id',Integer,ForeignKey('articles.id')),
    Column('tag_id',Integer,ForeignKey('tags.id'))
)

class Tag(Base):
    __tablename__= 'tags'
    id = Column(Integer,primary_key=True)
    name = Column( String(64) , nullable=False , index = True)

class Article(Base):
    __tablename__ = 'articles'
    id      = Column( Integer, primary_key =True )
    title   = Column( String(255) , nullable=False , index = True )
    content = Column(Text)
    user_id = Column(Integer,ForeignKey('users.id'))
    cate_id = Column(Integer, ForeignKey('categories.id'))
    #  articles 表不知道第三張表,所以關聯一下第三張表
    tags = relationship('Tag', secondary='article_tag', backref='articles')

說明:建立了article_tag表,有兩個欄位 article_id 和 tag_id 。

4、對映到資料

表已經描述好了,在檔案末尾使用下面的命令在我們連線的資料庫中建立對應的表:

if __name__ == '__main__':
    Base.metadata.create_all(engine) #建立表結構 (這裡是父類調子類)

這裡寫圖片描述

相關推薦

SQLAlchemy 連線 MySQL 資料庫

一、ORM介紹 ORM 全稱 Object Relational Mapping, 翻譯過來叫物件關係對映。簡單的說,ORM 將資料庫中的表與面嚮物件語言中的類建立了一種對應關係。這樣,我們要操作資料庫,資料庫中的表或者表中的一條記錄就可以直接通過操作類或者類

Python中使用SQLAlchemy連線Mysql資料庫單表操作

一,SQLAlchemy的安裝 使用 $ easy_install sqlalchemy 或 $ pip install sqlalchemy 如果出現什麼錯,就進去root使用者下進行安裝試試,或者網上查查 >>>

MySQL資料庫__2018.10.29

1.模糊查詢:SELECT *FROM info WHERE 密碼1 LIKE'%89%'; 資料庫通過SQL語言來管理。 DDL:資料定義語言 DML:資料操作語言 DQL:資料查詢語言 DCL:資料控制語言 整合開發環境:MAMP、MapServer。 通過寫一些SQ

MySQL資料庫編譯安裝、安裝後優化操作及超戶忘記資料庫密碼的解決方法

MySQL的下載地址:http://www.dev.mysql.com/downloads 準備工作:解除安裝rpm方式安裝的mysql-server、mysql       rpm -qa | grep mysql 若存在,用rpm -e mysql-server mysql --nodeps命令解除

springboot連線mysql資料庫2

第一步找到檢視——工具視窗——database或者在視窗的右側找到,,具體看我畫紅線部分然後點選。 第二步點選“+”然後找到Database——Mysql 點選 第三步按紅線部分分別寫入機器名,資料庫名,賬戶名,密碼,然後點選測試,出現右側Successful,說明連線成功,點選右

Linux —mysql資料庫

本章內容 關係型資料庫基礎 安裝MySQL 管理資料庫和表 使用者和許可權管理 函式和儲存過程 MySQL架構 儲存引擎 伺服器選項,系統和狀態變數 優化查詢和索引管理 鎖和事務管理 日誌管理 ###必須掌握 備份還原 ###必須掌握

毛毛Python進階之路6——MySQL 資料庫

毛毛Python進階之路6——MySQL 資料庫(一) DBMS 系統:資料庫管理系統。 一、安裝和下載: MySQL有兩種安裝方式,一種可執行檔案(點點點就可以),另一種是壓縮包式,需要有一定的基礎,比如新增環境變數,新增程序等等。 1、新增環境變數:計算機屬性-高階系統

express+mysql+vue專案入門-express服務端連線mysql資料庫

 express+mysql+vue專案入門-express服務端連線mysql資料庫,此方法mysql為例:新增一個mysql連線模組並匯出,在服務端入口匯入使用即可 var mysql = req

python連線MongoDB資料庫

說明:個人python開發環境為vscode第一步:安裝python和MongoDB 附:MongoDB視覺化工具robomongo下載地址(https://robomongo.org/download)第二步:連線資料庫具體程式碼如下import pymongo#建立資料庫

讀取股票資料儲存到本地MySQL資料庫

主要有三個步驟:(1)從東方財富上爬蟲讀取到所有股票的codelist;(2)從鳳凰網的api獲取到某隻股票歷史上所有資料,開盤收盤價,成交量,成交金額,ma均線價格等資料;(3)通過pymysql將獲取到的資料儲存到本地。 第一個步驟的實現,從EAST_MONEY_URL

Saiku連線mysql資料庫

Saiku連線Mysql資料庫展示資料 參考連結:https://www.cnblogs.com/shirui/p/8573491.html 前提:Saiku已安裝好,mysql已安裝好   1.新增Saiku的資料庫驅動: mysql-connect-java-5.1.17.jar 下載

連線mysql資料庫

Django預設使用的是Python自帶的SQLite3,SQLite3資料庫並不適用於大型的專案。除此之外,Django還支援以下幾種資料庫: 1.PostgreSQL(http://ww

Java開發程式碼規範之MySQL資料庫——建表規約

文章通過學習《阿里巴巴Java開發手冊》整理 1。表達是否概念的欄位,必須使用is_xxx的方式命名,資料型別是unsigned tinyint(1表示是,0表示否) 說明:任何欄位如果為非負數,必須是unsigned。 例子:表達邏輯刪除的欄位名

【原創】python3將圖片寫入mysql資料庫

01.環境準備使用的包:pymysqlpymysql下載地址:https://pypi.python.org/pypi/PyMySQL#downloads02.pymysql安裝:03.mysql的blob欄位解釋:BLOB型別的欄位用於儲存二進位制資料MySQL中,BLOB

centos下 c++連線mysql資料庫

程式碼:http://download.csdn.net/detail/chuanyu/9674720 一開始真是各種坑 安裝了mysql-server    , mysql-client,   mysql-devel 查找了mysql的位置 :locate  mysql

Web—網頁連線Mysql資料庫php網站建設

<?php $lnk = mysql_connect('localhost', 'root', '********') or die ('連線失敗 : ' . mysql_error());//密

MySQL資料庫MySQL5.5伺服器安裝

前言             MySQL是一個,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型資料庫管理系統之一,在 WEB 應用方面,MySQL是最

Python3 pymysql操作mysql資料庫

一. 連線mysql : pymysql.connect()import pymysql # 連線資料庫 conn = pymysql.connect(host='127.0.0.1', user='***', # 資料庫使用

nodejs之MAC上終端操作mysql資料庫

-------------刪除解除安裝mysql資料庫--------- 解除安裝MySQL,終端執行: 開啟終端視窗 使用mysqldump備份你的資料庫將文字檔案! 停止資料庫伺服器 sudo rm /usr/local/my

mysql資料庫關閉遠端訪問

通過MySQL使用者去限制訪問 開啟遠端訪問: - 更新使用者 use mysql; update user set host = "%" where user = "root"; flush privileges; - 新增使用者 use mysql; insert in