python學(xué)習(xí)之pymysql和sqlalchemy

PyMySQL 是在 Python3.x 版本中用于連接 MySQL 服務(wù)器的一個(gè)庫(kù),
Python2中則使用MySQLdb谁帕。


python學(xué)習(xí)之pymysql和sqlalchemy
python學(xué)習(xí)之pymysql和sqlalchemy

數(shù)據(jù)庫(kù)查詢操作


python學(xué)習(xí)之pymysql和sqlalchemy

01_python數(shù)據(jù)庫(kù)編程基本操作.py

import pymysql

#1). 創(chuàng)建數(shù)據(jù)庫(kù)連接, autocommit是否自動(dòng)提交修改到數(shù)據(jù)庫(kù)中.
conn = pymysql.connect(host='localhost', user='root', password='westos',
                db='Blog', port=3306, autocommit=True, charset='utf8')
#2). 創(chuàng)建游標(biāo)(用來執(zhí)行sql語(yǔ)句的)
cur = conn.cursor()

#3). 執(zhí)行sql語(yǔ)句
insert_sql = 'insert into users(username) values ("user6");'
cur.execute(insert_sql)

print("插入數(shù)據(jù)成功.......")
#4). 關(guān)閉游標(biāo)
cur.close()
#5).關(guān)閉連接
conn.close()

02_python數(shù)據(jù)庫(kù)編程基本操作.py

class Connection(object):
  def __enter__(self):
        Context manager that returns a Cursor
        warnings.warn(
            "Context manager API of Connection object is deprecated; Use conn.begin()",
            DeprecationWarning)
        return self.cursor()

    def __exit__(self, exc, value, traceback):
        On successful exit, commit. On exception, rollback(回滾)
        if exc:
            self.rollback()
        else:
            self.commit()
import pymysql

#使用with語(yǔ)句是康愤, pymysql.connect返回的是數(shù)據(jù)庫(kù)游標(biāo)。(具體的內(nèi)容查看源代碼)
with pymysql.connect(host='localhost', user='root', password='westos',
                db='Blog', port=3306, autocommit=True, charset='utf8') as cur:
    #3). 執(zhí)行sql語(yǔ)句(增刪改)
    insert_sql = 'insert into users(username) values ("user7");'
    cur.execute(insert_sql)
    print("插入數(shù)據(jù)成功.......")

03_數(shù)據(jù)庫(kù)批量操作.py

import pymysql

users = [('redhat' + str(i), 'passwd'+str(i)) for i in range(100)]
#users = [('redhat1', 'passwd1'), ('redhat2', 'passwd2'), .......]

#使用with語(yǔ)句是择膝, pymysql.connect返回的是數(shù)據(jù)庫(kù)游標(biāo)肴捉。(具體的內(nèi)容查看源代碼)
with pymysql.connect(host='localhost', user='root', password='westos',
                db='Blog', port=3306, autocommit=True, charset='utf8') as cur:
    #3). 執(zhí)行sql語(yǔ)句(增刪改)
    insert_sql = 'insert into users(username, password) values (%s, %s);'
    #execute: 執(zhí)行一條sql語(yǔ)句。
    #executemany: 執(zhí)行多條sql語(yǔ)句傲隶。
    #'insert into users(username, password) values (%s, %s);' %users[0]
    #'insert into users(username, password) values (%s, %s);' %('redhat1', 'passwd1')
    #'insert into users(username, password) values (%s, %s);' %users[1]
    #'insert into users(username, password) values (%s, %s);' %users[2]
    cur.executemany(insert_sql, users)
    print("插入數(shù)據(jù)成功.......")

04_python查詢數(shù)據(jù)庫(kù)信息.py

import pymysql

with pymysql.connect(host='localhost', user='root', password='westos',
                db='Blog', port=3306, autocommit=True, charset='utf8') as cur:
    #3). 執(zhí)行sql語(yǔ)句(增刪改)
    query_sql = 'select * from users where username like "user%";'
    #Number of affected rows
    result = cur.execute(query_sql)
    print("符合條件的記錄數(shù): ", result)

    #print(cur.fetchone())
    #print(cur.fetchmany(2))
    users_info = cur.fetchall()

#以表格方式美觀的打印跺株。
from  prettytable import  PrettyTable
pt = PrettyTable(field_names=['編號(hào)', '用戶名', '密碼'])
for user in users_info:
    pt.add_row(user)
print(pt)

05_sqlite數(shù)據(jù)庫(kù).py

1. 什么是sqlite數(shù)據(jù)庫(kù)?
SQLite是內(nèi)嵌在Python中的輕量級(jí)乒省、基于磁盤文件袋額數(shù)據(jù)庫(kù)管理系統(tǒng)(就是一個(gè)文件)袖扛,
不需要安裝和配置服務(wù)攻锰,支持使用SQL語(yǔ)句來訪問數(shù)據(jù)庫(kù)妓雾。該數(shù)據(jù)庫(kù)使用C語(yǔ)言開發(fā)械姻,支持大多數(shù)SQL91標(biāo)準(zhǔn)楷拳,
支持原子的吏奸、一致的奋蔚、獨(dú)立的和持久的事務(wù),不支持外鍵限制坤按;通過數(shù)據(jù)庫(kù)級(jí)的獨(dú)占性和共享性鎖定來實(shí)現(xiàn)獨(dú)立事務(wù)臭脓,
當(dāng)多個(gè)線程同時(shí)訪問同一個(gè)數(shù)據(jù)庫(kù)并試圖寫入數(shù)據(jù)時(shí)来累,每一時(shí)刻只有一個(gè)線程可以寫入數(shù)據(jù)。
2. sqlite數(shù)據(jù)庫(kù)的特性:
  SQLite支持最大140TB大小的單個(gè)數(shù)據(jù)庫(kù)偎巢,每個(gè)數(shù)據(jù)庫(kù)完全存儲(chǔ)在單個(gè)磁盤文件中压昼,
以B+樹數(shù)據(jù)結(jié)構(gòu)的形式存儲(chǔ)窍霞,一個(gè)數(shù)據(jù)庫(kù)就是一個(gè)文件但金,通過直接復(fù)制數(shù)據(jù)庫(kù)文件就可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)的備份冷溃。
如果需要使用可視化管理工具,可以下載并使用SQLiteManager似枕、SQLite Database Browser 或其他類似工具凿歼。
import sqlite3
#1). 創(chuàng)建連接
conn = sqlite3.connect(database='users.sqlite')

#2). 創(chuàng)建游標(biāo)
cur = conn.cursor()

#3). 操作
#if not exists如果數(shù)據(jù)庫(kù)標(biāo)不存在時(shí)創(chuàng)建表答憔,否則不做操作虐拓。
create_sql = 'create table if not exists userinfo1 (id int auto_increment primary key , name varchar(10) unique, passwd varchar(10) default "123");'
cur.execute(create_sql)
insert_sql = 'insert into userinfo1(name) values("user2");'
cur.execute(insert_sql)
#數(shù)據(jù)操作(增刪改)一定需要提交蓉驹。
conn.commit()
select_sql = 'select * from userinfo1'
cur.execute(select_sql)
print("查詢結(jié)果: ", cur.fetchall())

cur.close()
conn.close()

什么是ORM?
ORM,即Object-Relational Mapping(對(duì)象關(guān)系映射),它的作用是在關(guān)系型數(shù)據(jù)庫(kù)和
業(yè)務(wù)實(shí)體對(duì)象之間作一個(gè)映射,這樣,我們?cè)诰唧w的操作業(yè)務(wù)對(duì)象的時(shí)候,就不需要再
去和復(fù)雜的SQL語(yǔ)句打交道,只需簡(jiǎn)單的操作對(duì)象的屬性和方法谱轨。


python學(xué)習(xí)之pymysql和sqlalchemy

安裝sqlalchemy

  1. 需要一臺(tái)有安裝mysql數(shù)據(jù)庫(kù)的機(jī)器

  2. 安裝模塊: pip3 install sqlalchemy

  3. 查看版本信息
    python學(xué)習(xí)之pymysql和sqlalchemy

    連接數(shù)據(jù)庫(kù)
    在sqlalchemy中,session用于創(chuàng)建程序與數(shù)據(jù)庫(kù)之間的會(huì)話诗茎。所有對(duì)象的載
    入和保存都需要通過session對(duì)象敢订。


    python學(xué)習(xí)之pymysql和sqlalchemy

    創(chuàng)建映射(創(chuàng)建表)
    一個(gè)映射對(duì)應(yīng)著一個(gè)Python類,用來表示一個(gè)表的結(jié)構(gòu)昭齐。


    python學(xué)習(xí)之pymysql和sqlalchemy

    添加單條數(shù)據(jù)


    python學(xué)習(xí)之pymysql和sqlalchemy

    添加多條數(shù)據(jù)


    python學(xué)習(xí)之pymysql和sqlalchemy

    查找數(shù)據(jù)
    在sqlalchemy模塊中,查找數(shù)據(jù)給提供了query()的方法


    python學(xué)習(xí)之pymysql和sqlalchemy

    刪除數(shù)據(jù)


    python學(xué)習(xí)之pymysql和sqlalchemy

06_對(duì)象關(guān)系映射.py

import sqlalchemy
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
import pymysql
pymysql.install_as_MySQLdb()

#object(oop) ---> mysql(SQL)
#1). 創(chuàng)建數(shù)據(jù)庫(kù)引擎(連接數(shù)據(jù)庫(kù)的過程)
#echo=True顯示翻譯好的SQL語(yǔ)句怪蔑。
from sqlalchemy.orm import Session, sessionmaker

engine = sqlalchemy.create_engine("mysql://root:westos@localhost/Blog",
                         encoding='utf8', echo=True)

#2). 建立緩存
session = sessionmaker(bind=engine)()

#3). 創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象需要繼承的基類
Base = declarative_base()

#4). 創(chuàng)建類, 一個(gè)類就是一個(gè)數(shù)據(jù)庫(kù)表
class Student(Base):
    # 數(shù)據(jù)庫(kù)表的名稱
    __tablename__ = 'student_info'
    #數(shù)據(jù)庫(kù)表的屬性信息
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(20))
    sex = Column(String(10))

    #def __repr__(self):
    #return  'Student<%s>' %(self.name)

if __name__ == '__main__':
    # 根據(jù)設(shè)置的信息創(chuàng)建數(shù)據(jù)庫(kù)表-(創(chuàng)建類:創(chuàng)建數(shù)據(jù)庫(kù)表的過程)
    Base.metadata.create_all(engine)

    #添加數(shù)據(jù)信息(實(shí)例化對(duì)象: 添加一條數(shù)據(jù)/記錄)
    #INSERT INTO student_info (id, name, sex) VALUES (%(id)s, %(name)s, %(sex)s)
    stu1 = Student(id=2, name='westos2', sex='男')
    #stu2 = Student(id=3, name='westos3', sex='男')
    #stu3 = Student(id=4, name='westos4', sex='女')
    session.add_all([stu1, ])
    session.commit()

    #查詢數(shù)據(jù)信息
    print(session.query(Student).all())

    #根據(jù)篩選條件查詢信息
    print(session.query(Student).filter_by(name='westos1').all())
    print(session.query(Student).filter_by(name='westos1').first())
    print(session.query(Student).filter_by(name='westoshdhwhdewd').first())

    #刪除數(shù)據(jù)
    stu1 = session.query(Student).filter_by(name='westos2').first()

    print("before delete: ", stu1)
    session.delete(stu1)
    session.commit()
    stu1 = session.query(Student).filter_by(name='westos1').first()
    print("after delete: ", stu1)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市隧甚,隨后出現(xiàn)的幾起案子戚扳,更是在濱河造成了極大的恐慌咖城,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件握础,死亡現(xiàn)場(chǎng)離奇詭異悴品,居然都是意外死亡苔严,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岖妄,“玉大人型将,你說我怎么就攤上這事七兜⊥笾” “怎么了恬惯?”我有些...
    開封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵酪耳,是天一觀的道長(zhǎng)刹缝。 經(jīng)常有香客問我,道長(zhǎng)梢夯,這世上最難降的妖魔是什么言疗? 我笑而不...
    開封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮颂砸,結(jié)果婚禮上噪奄,老公的妹妹穿的比我還像新娘。我一直安慰自己人乓,他們只是感情好勤篮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著色罚,像睡著了一般碰缔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上戳护,一...
    開封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天梗肝,我揣著相機(jī)與錄音,去河邊找鬼匆绣。 笑死崎淳,一個(gè)胖子當(dāng)著我的面吹牛嚣镜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跌捆,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼抄瓦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤涩僻,失蹤者是張志新(化名)和其女友劉穎嵌巷,沒想到半個(gè)月后坪圾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年护奈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚌讼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出械馆,到底是詐尸還是另有隱情冶忱,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布忆植,位于F島的核電站耀里,受9級(jí)特大地震影響咙鞍,放射性物質(zhì)發(fā)生泄漏续滋。R本人自食惡果不足惜朗恳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一劝堪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸盯仪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钥弯。三九已至,卻和暖如春睛蛛,著一層夾襖步出監(jiān)牢的瞬間旭从,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工鸽素, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留付鹿,地道東北人坐梯。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓钱贯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容