Python資料庫ORM工具sqlalchemy的學習筆記

2021-01-08 TechWeb

SQLAlchemy是python的一個資料庫ORM工具,提供了強大的對象模型間的轉換,可以滿足絕大多數資料庫操作的需求,並且支持多種資料庫引擎(sqlite,mysql,postgres, mongodb等),在這裡記錄基本用法和學習筆記。

一、安裝

通過pip安裝

$ pip install SQLAlchemy 

二、使用

首先是連接到資料庫,SQLALchemy支持多個資料庫引擎,不同的資料庫引擎連接字符串不一樣,常用的有

mysql://username:password@hostname/database postgresql://username:password@hostname/database sqlite:////absolute/path/to/database sqlite:///c:/absolute/path/to/database 

更多連接字符串的介紹參見這裡

下面是連接和使用sqlite資料庫的例子

1. connection

使用傳統的connection的方式連接和操作資料庫

from sqlalchemy import create_engine  # 資料庫連接字符串 DB_CONNECT_STRING = 'sqlite:///:memory:'  # 創建資料庫引擎,echo為True,會列印所有的sql語句 engine = create_engine(DB_CONNECT_STRING, echo=True)  # 創建一個connection,這裡的使用方式與python自帶的sqlite的使用方式類似 with engine.connect() as con:     # 執行sql語句,如果是增刪改,則直接生效,不需要commit     rs = con.execute('SELECT 5')     data = rs.fetchone()[0]     print "Data: %s" % data 

與python自帶的sqlite不同,這裡不需要Cursor光標,執行sql語句不需要commit

2. connection事務

使用事務可以進行批量提交和回滾

from sqlalchemy import create_engine  # 資料庫連接字符串 DB_CONNECT_STRING = 'sqlite:////Users/zhengxiankai/Desktop/Document/db.sqlite' engine = create_engine(DB_CONNECT_STRING, echo=True)  with engine.connect() as connection:     trans = connection.begin()     try:         r1 = connection.execute("select * from User")         r2 = connection.execute("insert into User(name, age) values(?, ?)", 'bomo', 24)         trans.commit()     except:         trans.rollback()         raise  

3. session

connection是一般使用資料庫的方式,sqlalchemy還提供了另一種操作資料庫的方式,通過session對象,session可以記錄和跟蹤數據的改變,在適當的時候提交,並且支持強大的ORM的功能,下面是基本使用

from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker  # 資料庫連接字符串 DB_CONNECT_STRING = 'sqlite:////Users/zhengxiankai/Desktop/Document/db.sqlite'  # 創建資料庫引擎,echo為True,會列印所有的sql語句 engine = create_engine(DB_CONNECT_STRING, echo=True)  # 創建會話類 DB_Session = sessionmaker(bind=engine)  # 創建會話對象 session = DB_Session()  # dosomething with session  # 用完記得關閉,也可以用with session.close()  

上面創建了一個session對象,接下來可以操作資料庫了,session也支持通過sql語句操作資料庫

session.execute('select * from User') session.execute("insert into User(name, age) values('bomo', 13)") session.execute("insert into User(name, age) values(:name, :age)", {'name': 'bomo', 'age':12})  # 如果是增刪改,需要commit session.commit()  

注意參數使用dict,並在sql語句中使用:key佔位

4. ORM

上面簡單介紹了sql的簡單用法,既然是ORM框架,我們先定義兩個模型類User和Role,sqlalchemy的模型類繼承自一個由declarative_base()方法生成的類,我們先定義一個模塊Models.py生成Base類

from sqlalchemy.ext.declarative import declarative_base  Base = declarative_base()  

User.py

from sqlalchemy import Column, Integer, String from Models import Base  class User(Base):     __tablename__ = 'User'     id = Column('id', Integer, primary_key=True, autoincrement=True)     name = Column('name', String(50))     age = Column('age', Integer)  

Role.py

from sqlalchemy import Column, Integer, String from Models import Base  class Role(Base):     __tablename__ = 'Role'     id = Column('id', Integer, primary_key=True, autoincrement=True)     name = Column('name', String(50))  

從上面很容易看出來,這裡的模型對應資料庫中的表,模型支持的類型有Integer, String, Boolean, Date, DateTime, Float,更多類型包括類型對應的Python的類型參見:這裡

Column構造函數相關設置

name:名稱 type_:列類型 autoincrement:自增 default:默認值 index:索引 nullable:可空 primary_key:外鍵

更多介紹參見這裡

接下來通過session進行增刪改查

from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from User import User from Role import Role from Models import Base  DB_CONNECT_STRING = 'sqlite:////Users/zhengxiankai/Desktop/Document/db.sqlite' engine = create_engine(DB_CONNECT_STRING, echo=True) DB_Session = sessionmaker(bind=engine) session = DB_Session()  # 1. 創建表(如果表已經存在,則不會創建) Base.metadata.create_all(engine)  # 2. 插入數據 u = User(name = 'tobi', age = 200) r = Role(name = 'user')  # 2.1 使用add,如果已經存在,會報錯 session.add(u) session.add(r) session.commit() print r.id  # 3 修改數據 # 3.1 使用merge方法,如果存在則修改,如果不存在則插入 r.name = 'admin' session.merge(r)  # 3.2 也可以通過這種方式修改 session.query(Role).filter(Role.id == 1).update({'name': 'admin'})  # 4. 刪除數據 session.query(Role).filter(Role.id == 1).delete()  # 5. 查詢數據 # 5.1 返回結果集的第二項 user = session.query(User).get(2)  # 5.2 返回結果集中的第2-3項 users = session.query(User)[1:3]  # 5.3 查詢條件 user = session.query(User).filter(User.id < 6).first()  # 5.4 排序 users = session.query(User).order_by(User.name)  # 5.5 降序(需要導入desc方法) from sqlalchemy import desc users = session.query(User).order_by(desc(User.name))  # 5.6 只查詢部分屬性 users = session.query(User.name).order_by(desc(User.name)) for user in users:     print user.name  # 5.7 給結果集的列取別名 users = session.query(User.name.label('user_name')).all() for user in users:     print user.user_name  # 5.8 去重查詢(需要導入distinct方法) from sqlalchemy import distinct users = session.query(distinct(User.name).label('name')).all()  # 5.9 統計查詢 user_count = session.query(User.name).order_by(User.name).count() age_avg = session.query(func.avg(User.age)).first() age_sum = session.query(func.sum(User.age)).first()  # 5.10 分組查詢 users = session.query(func.count(User.name).label('count'), User.age).group_by(User.age) for user in users:     print 'age:{0}, count:{1}'.format(user.age, user.count)  session.close() 

5. 多表關係

上面的所有操作都是基於單個表的操作,下面是多表以及關係的使用,我們修改上面兩個表,添加外鍵關聯(一對多和多對一)

User模型

from sqlalchemy import Column, Integer, String from sqlalchemy import ForeignKey from sqlalchemy.orm import relationship from Models import Base  class User(Base):     __tablename__ = 'users'     id = Column('id', Integer, primary_key=True, autoincrement=True)     name = Column('name', String(50))     age = Column('age', Integer)      # 添加角色id外鍵(關聯到Role表的id屬性)     role_id = Column('role_id', Integer, ForeignKey('roles.id'))     # 添加同表外鍵     second_role_id = Column('second_role_id', Integer, ForeignKey('roles.id'))      # 添加關係屬性,關聯到role_id外鍵上     role = relationship('Role', foreign_keys='User.role_id', backref='User_role_id')     # 添加關係屬性,關聯到second_role_id外鍵上     second_role = relationship('Role', foreign_keys='User.second_role_id', backref='User_second_role_id') 

Role模型

from sqlalchemy import Column, Integer, String from sqlalchemy.orm import relationship from Models import Base  class Role(Base):     __tablename__ = 'roles'     id = Column('id', Integer, primary_key=True, autoincrement=True)     name = Column('name', String(50))      # 添加關係屬性,關聯到User.role_id屬性上     users = relationship("User", foreign_keys='User.role_id', backref="Role_users")     # 添加關係屬性,關聯到User.second_role_id屬性上     second_users = relationship("User", foreign_keys='User.second_role_id', backref="Role_second_users") 

這裡有一點需要注意的是,設置外鍵的時候ForeignKey('roles.id')這裡面使用的是表名和表列,在設置關聯屬性的時候relationship('Role', foreign_keys='User.role_id', backref='User_role_id'),這裡的foreign_keys使用的時候類名和屬性名

接下來就可以使用了

u = User(name='tobi', age=200)  r1 = Role(name='admin') r2 = Role(name='user')  u.role = r1 u.second_role = r2  session.add(u) session.commit()  # 查詢(對於外鍵關聯的關係屬性可以直接訪問,在需要用到的時候session會到資料庫查詢) roles = session.query(Role).all() for role in roles:     print 'role:{0} users'     for user in role.users:         print ' {0}'.format(user.name)     print 'role:{0} second_users'     for user in role.second_users:         print ' {0}'.format(user.name) 

上面表示的是一對多(多對一)的關係,還有一對一,多對多,如果要表示一對一的關係,在定義relationship的時候設置uselist為False(默認為True),如在Role中

class Role(Base):     ...     user = relationship("User", uselist=False, foreign_keys='User.role_id', backref="Role_user")  

6. 多表查詢

多表查詢通常使用join進行表連接,第一個參數為表名,第二個參數為條件,例如

users = db.session.query(User).join(Role, Role.id == User.role_id)  for u in users:     print u.name  

join為內連接,還有左連接outerjoin,用法與join類似,右連接和全外連結在1.0版本上不支持,通常來說有這兩個結合查詢的方法基本夠用了,1.1版本貌似添加了右連接和全外連接的支持,但是目前只是預覽版

還可以直接查詢多個表,如下

result = db.session.query(User, Role).filter(User.role_id = Role.id) # 這裡選擇的是兩個表,使用元組獲取數據 for u, r in result:       print u.name  

三、資料庫遷移

sqlalchemy的資料庫遷移/升級有兩個庫支持alembic和sqlalchemy-migrate

由於sqlalchemy-migrate在2011年發布了0.7.2版本後,就已經停止更新了,並且已經不維護了,也積累了很多bug,而alembic是較後來才出現,而且是sqlalchemy的作者開發的,有良好的社區支持,所以在這裡只學習alembic這個庫

alembic實現了類似git/svn的版本管理的控制,我們可以通過alembic維護每次升級資料庫的版本

1. 安裝

通過pip安裝,pip會自動安裝相關的依賴

$ pip install alembic 

2. 初始化

安裝完成後再項目根目錄運行

yourproject/     alembic.ini     YOUR_ALEMBIC_DIR/         env.py         README         script.py.mako         versions/             3512b954651e_add_account.py             2b1ae634e5cd_add_order_id.py             3adcc9a56557_rename_username_field.py  

其中

alembic.ini 提供了一些基本的配置 env.py 每次執行Alembic都會加載這個模塊,主要提供項目Sqlalchemy Model 的連接 script.py.mako 遷移腳本生成模版 versions 存放生成的遷移腳本目錄

默認情況下創建的是基於單個資料庫的,如果需要支持多個資料庫或其他,可以通過alembic list_templates查看支持的模板

$ alembic list_templates Available templates:  generic - Generic single-database configuration. multidb - Rudimentary multi-database configuration. pylons - Configuration that reads from a Pylons project environment.  Templates are used via the 'init' command, e.g.:    alembic init --template generic ./scripts  

3. 配置

使用之前,需要配置一下連結字符串,打開alembic.ini文件,設置sqlalchemy.url連接字符串,例如

sqlalchemy.url = sqlite:////Users/zhengxiankai/Desktop/database.db 

其他參數可以參見官網說明:http://alembic.zzzcomputing.com/en/latest/tutorial.html

4. 創建資料庫版本

接下來我們創建一個資料庫版本,並新建兩個表

$ alembic revision -m 'create table' 

創建一個版本(會在yourproject/YOUR_ALEMBIC_DIR/versions/文件夾中創建一個python文件1a8a0d799b33_create_table.py)

該python模塊包含upgrade和downgrade兩個方法,在這裡添加一些新增表的邏輯

"""create table  Revision ID: 4fd533a56b34 Revises: Create Date: 2016-09-18 17:20:27.667100  """ from alembic import op import sqlalchemy as sa   # revision identifiers, used by Alembic. revision = '4fd533a56b34' down_revision = None branch_labels = None depends_on = None  def upgrade():     # 添加表     op.create_table(         'account',         sa.Column('id', sa.Integer, primary_key=True),         sa.Column('name', sa.String(50), nullable=False),         sa.Column('description', sa.Unicode(200)),     )      # 添加列     # op.add_column('account', sa.Column('last_transaction_date', sa.DateTime))    def downgrade():     # 刪除表     op.drop_table('account')      # 刪除列     # op.drop_column('account', 'last_transaction_date')  

這裡使用到了了op對象,關於op對象的更多API使用,參見這裡

5. 升級資料庫

剛剛實現了升級和降級的方法,通過下面命令升級資料庫到最新版本

$ alembic upgrade head 

這時候可以看到資料庫多了兩個表alembic_version和account,alembic_version存放資料庫版本

關於升級和降級的其他命令還有下面這些

# 升到最高版本 $ alembic upgrade head  # 降到最初版本 $ alembic downgrade base  # 升兩級 $ alembic upgrade +2  # 降一級 $ alembic downgrade -1  # 升級到制定版本 $ alembic upgrade e93b8d488143  # 查看當前版本 $ alembic current  # 查看歷史版本詳情 $ alembic history --verbose  # 查看歷史版本(-r參數)類似切片 $ alembic history -r1975ea:ae1027 $ alembic history -r-3:current $ alembic history -r1975ea:  

6. 通過元數據升級資料庫

上面我們是通過API升級和降級,我們也可以直接通過元數據更新資料庫,也就是自動生成升級代碼,先定義兩個Model(User,Role),這裡我定義成三個文件

yourproject/     YOUR_ALEMBIC_DIR/     tutorial/Db         Models.py         User.py         Role.py 

代碼就放在一起了

from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base()  class User(Base):     __tablename__ = 'users'      id = Column('id', Integer, primary_key=True, autoincrement=True)     name = Column('name', String)  class Role(Base):     __tablename__ = 'roles'      id = Column('id', Integer, primary_key=True, autoincrement=True)     name = Column('name', String) 

在YOUR_ALEMBIC_DIR/env.py配置元數據

target_metadata = None 

改為

import os import sys  # 這裡需要添加相對路逕到sys.path,否則會引用失敗,嘗試過使用相對路徑,但各種不好使,還是使用這種方法靠譜些 sys.path.append(os.path.abspath(os.path.join(os.getcwd(), "../yourproject/tutorial/Db")))  from User import User from Role import Role from Models import Base target_metadata = Base.metadata  

os.path.join(os.getcwd()這個獲取到的地址不是env.py的路徑,而是根目錄

在創建資料庫版本的時候添加--autogenerate參數,就會從Base.metadata元數據中生成腳本

$ alembic revision --autogenerate -m "add user table" 

這時候會在生成升級代碼

"""add user table  Revision ID: 97de1533584a Revises: 8678ab6d48c1 Create Date: 2016-09-19 21:58:00.758410  """ from alembic import op import sqlalchemy as sa   # revision identifiers, used by Alembic. revision = '97de1533584a' down_revision = '8678ab6d48c1' branch_labels = None depends_on = None  def upgrade():     ### commands auto generated by Alembic - please adjust! ###     op.create_table('roles',     sa.Column('id', sa.Integer(), nullable=False),     sa.Column('name', sa.String(), nullable=True),     sa.PrimaryKeyConstraint('id')     )     op.create_table('users',     sa.Column('id', sa.Integer(), nullable=False),     sa.Column('name', sa.String(), nullable=True),     sa.PrimaryKeyConstraint('id')     )     op.drop_table('account')     ### end Alembic commands ###   def downgrade():     ### commands auto generated by Alembic - please adjust! ###     op.create_table('account',     sa.Column('id', sa.INTEGER(), nullable=False),     sa.Column('name', sa.VARCHAR(length=50), nullable=False),     sa.Column('description', sa.VARCHAR(length=200), nullable=True),     sa.Column('last_transaction_date', sa.DATETIME(), nullable=True),     sa.PrimaryKeyConstraint('id')     )     op.drop_table('users')     op.drop_table('roles')     ### end Alembic commands ###  

由於我沒有定義account模型,會被識別為刪除,如果刪除了model的列的聲明,則會被識別為刪除列,自動生成的版本我們也可以自己修改,然後執行升級命令即可升級alembic upgrade head

需要注意的是

Base.metadata聲明的類必須以資料庫中的一一對應,如果資料庫中有的表,而在元數據中沒有,會識別成刪除表 revision創建版本之前執行之前需要升級到最新版本 配置Base之前,需要保證所有的Model都已經執行(即導入)過一次了,否則無法讀取到,也就是需要把所有Model都import進來

資料庫升級有風險,升級前最好先檢查一遍upgrade函數,可以的話做好備份哈

四、常見問題

1. String長度問題

如果使用mysql資料庫,String類型對應的是VARCHAR類型,需要指定長度,否則會報下面錯誤,而在sqlite不會出現

(in table 'user', column 'name'): VARCHAR requires a length on dialect mysql 

TODO:如有其他問題歡迎留言

五、參考連結

Auto Generating Migrations tutorial

最後安利一下自己的博客:http://blog.bomobox.org

點讚 0

相關焦點

  • SQLAlchemy 1.3.8 發布,Python ORM 框架
    SQLAlchemy 是一個 Python 的 SQL 工具包以及資料庫對象映射(ORM)框架。它包含整套企業級持久化模式,專門用於高效和高性能的資料庫訪問。新版本包含對新的 psycopg2 「執行值」性能的修復,以適應由編譯器掛鈎修改的 INSERT 語句。
  • 學好ORM框架SQLAlchemy面試必問
    首先我們先來了解一下SQLAlchemySQLAlchemy是Python程式語言下的一款ORM框架,該框架建立在資料庫API之上,使用關係對象映射進行資料庫操作,簡言之便是:將對象轉換成SQL,然後使用數據API執行SQL並獲取執行結果。
  • SQLAlchemy 1.2.7 發布,Python 的 ORM 框架
    SQLAlchemy 1.2.7 已發布,引入了一系列針對 Core 和 ORM 的修復:[orm] [bug] Fixed regression
  • Python通過SQLAlchemy-ORM訪問操作MySQL資料庫
    SQLAlchemy,則需要導入sqlalchemy模塊:import sqlalchemy在實際編寫代碼時,為簡化代碼,一般不直接使用import sqlalchemy,而是使用sqlalchemy模塊中直接用到的相關部分,參考如下: 根據引擎對象myengine構建一個基類BaseBase = declarative_base(myengine)有了這個基類Base,
  • Python入門 | 資料庫1
    資料庫永遠是數據管理上最值得使用的工具。而把所收集的大量數據放入資料庫之後再處理是數據科學實踐項目中必不可少的一步。通過前面章節的學習,我們已經掌握了利用Python分析數據的眾多模塊,特別地也展示了如何利用爬蟲技術爬取本書中最常使用的火鍋團購數據的全過程。本章假設的分析場景是火鍋團購數據被爬取後,由於數據量過大已經進入資料庫保存。
  • SQLAlchemy基礎入門
    精華推薦:重磅發布 - 自動化框架基礎指南pdf什麼是SQLAlchemySQLAlchemy是Python SQL工具包和對象關係映射器,它為應用程式開發人員提供了SQL的全部功能和靈活性。它提供了一套完整的眾所周知的企業級持久性模式,專為高效和高性能的資料庫訪問而設計,適用於一種簡單的python域語言。
  • SQLAlchemy 1.3.12 發布,Python ORM 框架
    SQLAlchemy 是一個 Python 的 SQL 工具包以及資料庫對象映射(ORM)框架。它包含整套企業級持久化模式,專門用於高效和高性能的資料庫訪問。更新內容如下:orm 修復了涉及 lazy="raise" 策略的問題,在該策略中,對象的 ORM 刪除將引發配置了 lazy="raise" 的簡單 「use-get」 樣式多對一關係。
  • Python通過"SQLAlchemy-Raw_SQL"方式來訪問操作MySQL資料庫
    Python訪問操作資料庫的綜合工具。SQLAlchemy首次發行於2006年2月,並迅速地在Python社區中最廣泛使用的ORM工具之一,不亞於Django的ORM框架。註:在Windows上,SQLAlchemy的默認安裝位置為:{python
  • SQLAlchemy 1.1.10 發布,Python 的 ORM 框架
    SQLAlchemy 是一個Python 的SQL 工具包以及資料庫對象映射框架。它包含整套企業級持久化模式,專門為高效和高性能的資料庫訪問。oraclemisc下載地址:https://www.sqlalchemy.org/download.html>>>【全民狂歡,評論有禮】5月15日-31日評論每日更新的「新聞資訊和軟體更新資訊」,評論點讚數超過 20 的可登上每周更新的「源資訊」和「軟體周刊」兩大欄目,點讚數超過 50 的還將獲得
  • Python通過SQLAlchemy-SQL_Expression來訪問操作MySQL資料庫
    Python訪問操作資料庫的綜合工具。SQLAlchemy首次發行於2006年2月,並迅速地在Python社區中最廣泛使用的ORM工具之一,不亞於Django的ORM框架。模塊:import sqlalchemy在實際編碼時,為簡化代碼,一般不直接使用import sqlalchemy,而是使用sqlalchemy模塊中直接用到的相關部分
  • 學Python很久不知道怎麼學?看看這份Python學習清單
    學習Python沒有章法,那麼編程就無法建立體系,這就導致了一種現象:學了好長的一段時間感覺仍然只學了一個皮毛。所以,w3cschool整理了一份Python學習任務清單,按照先後順序,由簡單到複雜學習Python,假以時日定能玩轉Python。
  • Python教父推薦的一份Python學習清單,秀兒拿走學去吧,最適合你
    學習Python沒有章法,那麼編程就無法建立體系,這就導致了一種現象:學了好長的一段時間感覺仍然只學了一個皮毛。所以,w3cschool整理了一份Python學習任務清單,按照先後順序,由簡單到複雜學習Python,假以時日定能玩轉Python。
  • Python ORM框架SQLAlchemy1.3.20發布
    SQLAlchemy 是一個 Python 的 SQL 工具包以及資料庫對象映射(ORM)框架。它包含整套企業級持久化模式,專門用於高效和高性能的資料庫訪問。修復了在 sqlalchemy.exc 模塊中未使用 SQLAlchemy 的標準後期導入系統的功能級別的導入。
  • 什麼是Python,學習Python的未來前景及發展方向
    Python被稱為最接近AI的語言,幾乎所有的深度學習框架都使用Python編程。Python的設計理念是「優雅」、「清晰」、「簡單」。所以Python開發者「做同一件事總有很多方法」的想法,通常是讓人難以忍受的。
  • 清華北大多位專家分析討論Python未來的前景+整套python教程分享
    Python言語有一個特點就是沒有什麼特別強勢的,可是它能夠使用都非常的多範疇,並且效率高的可怕,Python的使用範疇非常多,現在據了解國內應該是沒有太多人學習Python,而Python的招聘和薪酬確實非常的高,現在有許多大型企業如騰訊,阿里,百度,搜狐,微軟,谷歌,華為這些大型網際網路公司都是用高薪延聘Python開發人員。
  • 靈活使用 SQLAlchemy 中的 ORM 查詢
    Book.price > 40) \ .all()print([dict(zip(v.keys(), v)) for v in books])結果[{&39;: 9, &39;: &39;, &39;: &39;}]統計各個分類的圖書的數量from sqlalchemy
  • Pony - 最智能的 Python ORM 框架
    在 Github 上開源的 Python ORM 框架,項目位於 https://github.com/ponyorm/pony,目前版本為 0.7.13。Pony 提供了十分 Pythonic 的 API,易於學習,使用方便。Pony 提供了基於實體的數據模型定義,精簡的查詢語法,全面的報錯信息,並能輸出可讀性強的生成的 SQL 語句。這些大大提升了開發效率,使得使用 Python 語言進行資料庫操作更為方便。
  • Python新手必學知識點,我為你總結好了
    人生苦短,我用python1.基礎語法connect 連結cursor 遊標對象execute 執行sqlfetchall 獲取執行的結果orm(SqlAlchemy 下期敬請期待)簡單的前端展示數據table,tbody,tr
  • Python工程師在企業的定位如何
    c測試運維,指的是用python實現的測試工具以及過程,包含伺服器端、客戶端、web等這些自動化測試過程,自動化性能測試的執行、監控和分析,常用的框架有selenium appium等。python可以寫很多的腳本,把運維工作中日常操作涵蓋了監控,部署,網絡配置,日誌分析,安全檢測 等這些「操作」做到極致。
  • 虛擬機、Linux、Python與資料庫入門學習的幾個問題
    資料庫入門學習哪個好初學者建議從輕量級的桌面級資料庫開始入門。在標準的SQL語句支持方面和關係資料庫設計方面來說,桌面型的小型資料庫與大中型商用資料庫基本是一致的(當然各個資料庫實際上是存在比較明顯的區別的),主要區別在於桌面型資料庫一般通過單個資料庫文件來記錄數據,在處理多並發時性能下降較快,無法適應中大型應用需求,但作為個人使用或學習來說則非常合適。