新聞中心
作為目前更受歡迎的編程語言之一,Python已經(jīng)成為了許多開發(fā)人員的首選語言。Python的優(yōu)點包括代碼易讀、語法簡單、大量支持庫等優(yōu)點。與此同時,Python的生態(tài)系統(tǒng)也非常豐富,包含了大量的第三方庫,可用于執(zhí)行各種各樣的任務(wù)。

其中,Python在操作數(shù)據(jù)庫方面表現(xiàn)得尤為出色。Python可以運用不同的庫連接和操作多種類型的數(shù)據(jù)庫,這使得它成為了數(shù)據(jù)科學(xué)家和軟件開發(fā)人員更受歡迎的語言之一。在本文中,我們將介紹在Python中使用SQLAlchemy和Psycopg2庫操作數(shù)據(jù)庫的方法。
SQLAlchemy庫
SQLAlchemy是一個開源Python庫,用于操作關(guān)系數(shù)據(jù)庫。它提供了一種簡單且靈活的方式,用Python語言操作關(guān)系型數(shù)據(jù)庫(SQL數(shù)據(jù)庫)。 SQLalchemy被廣泛應(yīng)用于Web應(yīng)用程序中,如Flask、Django、Bottle等框架。SQLAlchemy通過ORM,提供了一種類似于SQL語言的操作方式。
安裝SQLAlchemy
要使用SQLAlchemy,需要在Python環(huán)境中安裝它??梢酝ㄟ^以下方式安裝:
“`python
!pip install sqlalchemy
“`
連接數(shù)據(jù)庫
在使用SQLAlchemy庫之前,必須先建立與數(shù)據(jù)庫的連接。為此,需要定義數(shù)據(jù)庫的URL,該URL包含以下元素:
– 數(shù)據(jù)庫引擎(dialect) – 在SqlAlchemy中,這通常是一個帶Chrome或mysql的名稱
– 連接的用戶名和密碼
– 數(shù)據(jù)庫主機和端口
– 數(shù)據(jù)庫名稱
下面是一個連接到SQL服務(wù)器的示例:
“`python
from sqlalchemy import create_engine
engine = create_engine(‘mssql+pyodbc://user:pass@dns’)
“`
在上面的示例中,創(chuàng)建了一個SQLAlchemy引擎,以便使用ODBC連接來連接到SQL服務(wù)器??梢詫ngine變量用于打開數(shù)據(jù)庫連接的控制。完成之后,就可以使用SQLAlchemy來執(zhí)行SQL操作。
執(zhí)行SQL查詢
可使用SQLAlchemy CRUD(CRUD(Create, Read, Update, Delete)操作。
下面是一個從本地SQLite數(shù)據(jù)庫創(chuàng)建表格的示例:
“`python
from sqlalchemy import create_engine, Table, Column, Integer, MetaData
engine = create_engine(‘sqlite:///some.db’)
metadata = MetaData()
table = Table(‘mytable’, metadata,
Column(‘id’, Integer, primary_key=True),
Column(‘name’, String),
Column(‘a(chǎn)ge’, Integer),
)
metadata.create_all(engine)
“`
在上面的示例中,安裝并創(chuàng)建Meta到和表的定義。這個表在SQLite數(shù)據(jù)庫中使用用戶ID、名稱和年齡列創(chuàng)建一個列。結(jié)果表User是由元數(shù)據(jù)對象的調(diào)用創(chuàng)建的。調(diào)用metadata.create_all(engine)將表創(chuàng)建到已定義的數(shù)據(jù)庫中。
現(xiàn)在,使用SQLAlchemy來執(zhí)行SQL SELECT語句從User表中選擇所有條目的示例。
“`python
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData
from sqlalchemy.sql import select
engine = create_engine(‘sqlite:///some.db’)
metadata = MetaData()
mytable = Table(‘mytable’, metadata,
Column(‘id’, Integer, primary_key=True),
Column(‘name’, String),
Column(‘a(chǎn)ge’, Integer),
)
conn = engine.connect()
select_st = select([mytable])
result = conn.execute(select_st)
for row in result:
print(row)
“`
在此示例中,從mytable中選擇了所有條目,每個條目都包含一個id、name和age字段。然后使用engine.connect()打開一個數(shù)據(jù)庫連接,該連接可以執(zhí)行SQL查詢。使用conn.execute(select_all)執(zhí)行查詢,并將結(jié)果迭代打印到命令行中。
Psycopg2
與SQLAlchemy一樣,Psycopg2是一種與Python庫兼容的PostgreSQL數(shù)據(jù)庫開發(fā)庫。它可以用來連接、查詢、讀寫和管理PostgreSQL數(shù)據(jù)庫。一些典型的應(yīng)用場景包括后端開發(fā)、數(shù)據(jù)科學(xué)、數(shù)據(jù)分析、GIS、Web應(yīng)用程序和云計算等。
安裝Psycopg2
在Python環(huán)境中,可以使用以下安裝psycopg2:
“`python
!pip install psycopg2-binary
“`
連接到數(shù)據(jù)庫
連接到PostgreSQL數(shù)據(jù)庫與連接到其他數(shù)據(jù)庫類似。類似地,必須指定連接字符串(dsn),該字符串包含以下信息:
– 主機名、端口號
– 用戶名
– 密碼
– 數(shù)據(jù)庫名
可以使用psycopg2.connect()來創(chuàng)建連接:
“`python
import psycopg2
dsn_database = “someDatabase”
dsn_hostname = “mydbinstance.somehost.net”
dsn_port = “5432”
dsn_uid = “someUser”
dsn_pwd = “secret”
conn_string = “host=”+dsn_hostname+” port=”+dsn_port+” dbname=”+dsn_database+” user=”+dsn_uid+” password=”+dsn_pwd
conn = psycopg2.connect(conn_string)
“`
在上面的示例中,將所有連接信息添加到一個連接字符串中,并使用psycopg2.connect()創(chuàng)建連接。
執(zhí)行SQL查詢
下面是一個使用Psycopg2執(zhí)行SQL查詢的示例。在此示例中,創(chuàng)建了一個數(shù)據(jù)庫表(employees),并向其添加一些數(shù)據(jù)。接下來,以選擇所有記錄并打印結(jié)果的方式使用SELECT查詢對表執(zhí)行操作。
“`python
#!/usr/bin/python
import psycopg2
def mn():
conn_string = “host=’localhost’ dbname=’mydatabase’ user=’myusername’ password=’mypassword'”
try:
conn = psycopg2.connect(conn_string)
cursor = conn.cursor()
# 創(chuàng)建employees表
cursor.execute(“CREATE TABLE employees (id SERIAL PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50), hire_date DATE)”)
# 插入一個新的employee
cursor.execute(“INSERT INTO employees (first_name,last_name,hire_date) VALUES (‘John’, ‘Doe’, ‘2023-01-01’)”)
# 獲取所有employees
cursor.execute(“SELECT * FROM employees”)
rows = cursor.fetchall()
for row in rows:
print(row)
cursor.close()
conn.close()
except Exception as e:
print(str(e))
if __name__ == “__mn__”:
mn()
“`
在上面的示例中,首先我們創(chuàng)建一個employees表格,它包含id(自增長主鍵),first_name,last_name和hire_date字段。然后,我們添加了一個名為John Doe的新員工。使用SELECT獲取并打印所有employee的結(jié)果。
在本文中,我們介紹了Python中使用SQLAlchemy和Psycopg2庫操作數(shù)據(jù)庫的方法。無論你使用的是何種數(shù)據(jù)庫,都可以使用Python來操作數(shù)據(jù)庫。Python在操作數(shù)據(jù)庫方面的優(yōu)點包括簡潔易讀的代碼、廣泛可用的庫以及可運用不同的庫連接和操作多種類型的數(shù)據(jù)庫等。無論你是數(shù)據(jù)科學(xué)家、軟件開發(fā)人員還是其他人員,掌握Python操作數(shù)據(jù)庫的技能對你的工作和學(xué)習(xí)都非常有幫助。
相關(guān)問題拓展閱讀:
- 在python3下怎樣用flask-sqlalchemy對mysql數(shù)據(jù)庫操作
在python3下怎樣用flask-sqlalchemy對mysql數(shù)據(jù)庫操作
以 Debian/Ubuntu 為例(請確保有管理員權(quán)限):
1.MySQL
代碼如者粗伍下:
apt-get install mysql-server
apt-get install mysql-client
apt-get install libmysqlclient15-dev
2.python-mysqldb
代碼如下:
apt-get install python-mysqldb
3.easy_install
代碼如下:
wget
python ez_setup.py
4.MySQL-Python
代碼如下:
easy_install MySQL-Python
5.SQLAlchemy
代碼如下:
easy_install SQLAlchemy
6、安裝完成后使用下面代碼測試連接
代碼如下:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
DB_CONNECT_STRING = ‘mysql+
engine = create_engine(DB_CONNECT_STRING, echo=True)
DB_Session = sessionmaker(bind=engine)
session = DB_Session()
7、數(shù)據(jù)操作(增刪改查)
代碼如下:
from sqlalchemy import func, or_, not_
user = User(name=’a’)
session.add(user)
user = User(name=’b’)
session.add(user)
user = User(name=’a’)
session.add(user)
user = User()
session.add(user)
session.commit()
query = session.query(User)
print query # 顯示SQL 語句
print query.statement # 同上
for user in query: # 遍歷時查詢
print user.name
print query.all() # 返回的是一個類似列表的對象
print query.first().name # 記凳亂錄不存在時,first() 會返回 None
# print query.one().name # 不存在,或有多行記錄時會拋出異常
print query.filter(User.id == 2).first().name
print query.get(2).name # 以主鍵獲取,等效于上句
print query.filter(‘id = 2’).first().name # 支首或持字符串
query2 = session.query(User.name)
print query2.all() # 每行是個元組
print query2.limit(1).all() # 最多返回 1 條記錄
print query2.offset(1).all() # 從第 2 條記錄開始返回
print query2.order_by(User.name).all()
print query2.order_by(‘name’).all()
print query2.order_by(User.name.desc()).all()
print query2.order_by(‘name desc’).all()
print session.query(User.id).order_by(User.name.desc(), User.id).all()
print query2.filter(User.id == 1).scalar() # 如果有記錄,返回之一條記錄的之一個元素
print session.query(‘id’).select_from(User).filter(‘id = 1’).scalar()
print query2.filter(User.id > 1, User.name != ‘a(chǎn)’).scalar() # and
query3 = query2.filter(User.id > 1) # 多次拼接的 filter 也是 and
query3 = query3.filter(User.name != ‘a(chǎn)’)
print query3.scalar()
print query2.filter(or_(User.id == 1, User.id == 2)).all() # or
print query2.filter(User.id.in_((1, 2))).all() # in
query4 = session.query(User.id)
print query4.filter(User.name == None).scalar()
print query4.filter(‘name is null’).scalar()
print query4.filter(not_(User.name == None)).all() # not
print query4.filter(User.name != None).all()
print query4.count()
print session.query(func.count(‘*’)).select_from(User).scalar()
print session.query(func.count(‘1’)).select_from(User).scalar()
print session.query(func.count(User.id)).scalar()
print session.query(func.count(‘*’)).filter(User.id > 0).scalar() # filter() 中包含 User,因此不需要指定表
print session.query(func.count(‘*’)).filter(User.name == ‘a(chǎn)’).limit(1).scalar() == 1 # 可以用 limit() 限制 count() 的返回數(shù)
print session.query(func.sum(User.id)).scalar()
print session.query(func.now()).scalar() # func 后可以跟任意函數(shù)名,只要該數(shù)據(jù)庫支持
print session.query(func.current_timestamp()).scalar()
print session.query(func.md5(User.name)).filter(User.id == 1).scalar()
query.filter(User.id == 1).update({User.name: ‘c’})
user = query.get(1)
print user.name
user.name = ‘d’
session.flush() # 寫數(shù)據(jù)庫,但并不提交
print query.get(1).name
session.delete(user)
session.flush()
print query.get(1)
session.rollback()
print query.get(1).name
query.filter(User.id == 1).delete()
session.commit()
print query.get(1)
唔,貌似題主問題已經(jīng)解決了,挺好的。我還是答一下,給后續(xù)需要的新手一點幫助。
這個問題經(jīng)常難道新手一下,因為大部分教程里(包括經(jīng)典
的《Flask
Web開發(fā)》一書),告訴了我們?nèi)绾问褂胒lask-sqlalchemy操作sqlite,但在生產(chǎn)環(huán)境(線上網(wǎng)站)上,我們肯定是則返肆使用MySQL或其
他,而大部分的教程里,又告訴我們flask-sqlalchemy使用MySQL的方式是:
結(jié)果我們照葫蘆畫瓢的來一下,發(fā)現(xiàn)壓根不行,寫好的網(wǎng)站一跟數(shù)據(jù)庫沾邊就報錯。
Python和MySQL是「兩個國家的人」,他們互不相通,因而需要一個中間代理,讓雙方互通有無,跟翻譯一樣(這比喻不準(zhǔn)確,但足夠你明白意思就行)。翻譯又有很多選擇,不同的翻譯各有特色。
題
主解決問題選擇的翻譯是「flask-mysqldb」,其背后的主子是「MySQL-python」。恩,說到這里你應(yīng)該知道,「flask-xxx」
這樣的包都是對背后主子進(jìn)行了適合Flask封裝的插件,跟包子皮一樣,里面的餡才是重點,「flask-mysqldb」的餡是「MySQL-
python」。
而我要推薦的是另一個翻譯:PyMySQL,這玩意的好處是可以做異步(「MySQL-python」也可以,個人口味罷了),簡而言世悶之,網(wǎng)站訪問量大了就需要考慮異步,現(xiàn)在別管這是啥子。孫轎這玩意的安裝方式是:
pip install PyMySQL
之后,數(shù)據(jù)庫連接由:
改為
mysql+
就可以了。
python 操作數(shù)據(jù)庫的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于python 操作數(shù)據(jù)庫,Python輕松操作數(shù)據(jù)庫,在python3下怎樣用flask-sqlalchemy對mysql數(shù)據(jù)庫操作的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)頁標(biāo)題:Python輕松操作數(shù)據(jù)庫(python操作數(shù)據(jù)庫)
網(wǎng)站URL:http://fisionsoft.com.cn/article/ccosghs.html


咨詢
建站咨詢
