最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQLAlchemy編寫的MySQL數(shù)據(jù)庫遷移至金倉數(shù)據(jù)庫

 更新時間:2026年05月23日 08:56:36   作者:碼農(nóng)阿豪@新空間  
該文章詳細(xì)記錄將一個使用SQLAlchemy編寫的MySQL數(shù)據(jù)庫遷移至金倉數(shù)據(jù)庫的過程,主要步驟包括安裝SQLAlchemy、安裝金倉方言包、創(chuàng)建連接字符串、配置連接池、ORM建模和基本操作等,文章中提到了一些踩坑記錄,如方言包的安裝位置、版本匹配問題、連接字符串的書寫方式等

從一個報錯開始

上周接了個小活,要把一個用SQLAlchemy寫的數(shù)據(jù)分析腳本從MySQL遷到金倉。本來以為換個數(shù)據(jù)庫驅(qū)動就行,結(jié)果跑起來直接報錯:No module named 'sqlalchemy.dialects.kingbase'。

查了一圈才發(fā)現(xiàn),SQLAlchemy不像MySQL、PostgreSQL那樣自帶驅(qū)動,金倉的方言包需要手動裝。折騰了兩天才跑通,今天把過程記下來,希望能幫到遇到同樣問題的人。

一、方言包是什么,為什么非要手動裝

SQLAlchemy本身只是個殼,它不知道自己該怎么跟數(shù)據(jù)庫說話。每種數(shù)據(jù)庫需要一個“翻譯”,這個翻譯就叫方言包(dialect)。

MySQL、PostgreSQL這種主流數(shù)據(jù)庫,SQLAlchemy安裝的時候就把它們的方言包帶上了。但金倉不在這個列表里,所以得自己去官網(wǎng)下,然后手動放到指定位置。

方言包底層依賴ksycopg2驅(qū)動,所以這兩個都得裝。

二、安裝步驟(踩坑記錄)

2.1 先裝SQLAlchemy

pip install sqlalchemy

裝完看一眼裝在哪了,后面放方言包要用:

pip show sqlalchemy

我的機器輸出是這樣的:

Name: SQLAlchemy
Version: 1.4.36
Location: /usr/local/lib/python3.8/site-packages

記下這個Location路徑。

2.2 裝ksycopg2驅(qū)動

pip install ksycopg2

這個倒是順利,沒遇到什么問題。Windows用戶可能需要裝ksycopg2-win64。

2.3 放方言包(這里卡了我半天)

找到SQLAlchemy的安裝目錄,進(jìn)去找到dialects文件夾:

cd /usr/local/lib/python3.8/site-packages/sqlalchemy/dialects

把從官網(wǎng)下載的kingbase文件夾整個復(fù)制到這里。最終目錄結(jié)構(gòu)應(yīng)該是:

sqlalchemy/dialects/
├── kingbase/
│   ├── __init__.py
│   └── base.py
├── mysql/
├── postgresql/
└── ...

我一開始放錯了地方,放到了site-packages根目錄下,結(jié)果死活加載不了。后來仔細(xì)看了文檔才發(fā)現(xiàn)要放到dialects下面。

版本匹配問題:官方提供了1.3、1.4、2.0三個版本的方言包。我用的SQLAlchemy是1.4.36,選了1.4版本的方言包。版本不對會報一些奇怪的錯,比如找不到某個模塊。

三、連接數(shù)據(jù)庫

3.1 連接字符串怎么寫

折騰完安裝,終于可以寫代碼了。連接字符串的格式是:

from sqlalchemy import create_engine

engine = create_engine('kingbase+ksycopg2://SYSTEM:123456@127.0.0.1:54321/TEST')

翻譯一下:

  • kingbase:方言名,告訴SQLAlchemy用金倉的方言包
  • ksycopg2:驅(qū)動名,實際干活的是這個
  • SYSTEM:數(shù)據(jù)庫用戶名
  • 123456:密碼
  • 127.0.0.1:IP
  • 54321:端口(金倉默認(rèn)是這個)
  • TEST:數(shù)據(jù)庫名

+ksycopg2其實可以省略,寫成kingbase://...就行,默認(rèn)就是用它。

3.2 測試一下能不能連上

from sqlalchemy import create_engine

conn_str = 'kingbase://SYSTEM:123456@127.0.0.1:54321/TEST'
engine = create_engine(conn_str)

conn = engine.connect()
result = conn.execute("SELECT version()")
print(result.fetchone())
conn.close()

如果看到版本信息輸出,恭喜,連上了。

3.3 連接池參數(shù)(生產(chǎn)環(huán)境有用)

如果是寫Web服務(wù)或者長期運行的腳本,建議配置一下連接池:

engine = create_engine(
    'kingbase://SYSTEM:123456@127.0.0.1:54321/TEST',
    pool_size=10,          # 連接池里放多少個連接
    max_overflow=20,       # 不夠用時最多再創(chuàng)建多少個
    pool_recycle=3600,     # 連接用多久回收(秒)
    pool_pre_ping=True     # 用之前先ping一下,確認(rèn)還活著
)

pool_pre_ping=True這個參數(shù)挺實用的,能避免拿到一個已經(jīng)斷開的連接。

四、ORM建模和基本操作

連接搞定了,接下來看看怎么用ORM操作數(shù)據(jù)庫。

4.1 定義模型

先建個基類,然后定義表對應(yīng)的類:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, DateTime
from datetime import datetime

Base = declarative_base()

class User(Base):
    __tablename__ = 'test_user'  # 表名
    
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    email = Column(String(100))
    created_at = Column(DateTime, default=datetime.now)
    
    def __repr__(self):
        return f"User(id={self.id}, name='{self.name}', email='{self.email}')"

__tablename__是必須的,不寫SQLAlchemy不知道表叫什么。

4.2 建表

# 自動創(chuàng)建表(如果不存在的話)
Base.metadata.create_all(engine)

這個操作是冪等的,執(zhí)行多次也不會重復(fù)建表。

4.3 創(chuàng)建Session

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine)
session = Session()

4.4 增刪改查

插入數(shù)據(jù):

user1 = User(name='張三', email='zhangsan@test.com')
user2 = User(name='李四', email='lisi@test.com')

session.add(user1)
session.add(user2)
# 或者一次加多個:session.add_all([user1, user2])
session.commit()

查詢數(shù)據(jù):

# 查所有
users = session.query(User).all()
for u in users:
    print(u.name, u.email)

# 條件查詢
user = session.query(User).filter(User.name == '張三').first()
print(user.email)

# 模糊查詢
users = session.query(User).filter(User.name.like('%張%')).all()

更新數(shù)據(jù):

# 方式1:查出來改屬性
user = session.query(User).filter(User.name == '張三').first()
user.email = 'newemail@test.com'
session.commit()

# 方式2:批量更新(不查直接改)
session.query(User).filter(User.name == '張三').update(
    {"email": "batch_update@test.com"}
)
session.commit()

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

# 查出來刪
user = session.query(User).filter(User.name == '張三').first()
session.delete(user)
session.commit()

# 批量刪
session.query(User).filter(User.id > 100).delete()
session.commit()

4.5 事務(wù)處理

Session默認(rèn)不會自動提交,調(diào)用commit()才真正寫入。如果中間出錯,可以回滾:

try:
    session.add(User(name='王五', email='wangwu@test.com'))
    # 這里如果出錯...
    session.commit()
except Exception as e:
    session.rollback()
    print(f"出錯了: {e}")
finally:
    session.close()

4.6 完整跑一遍

把上面的代碼串起來,跑一個完整的例子:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, Integer, String

# 連數(shù)據(jù)庫
engine = create_engine('kingbase://SYSTEM:123456@127.0.0.1:54321/TEST')

# 定義模型
Base = declarative_base()
class User(Base):
    __tablename__ = 'test_user'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    email = Column(String(100))
    def __repr__(self):
        return f"User(id={self.id}, name={self.name})"

# 建表
Base.metadata.create_all(engine)

# 操作
Session = sessionmaker(bind=engine)
session = Session()

# 插入
session.add_all([
    User(name='張三', email='zhangsan@test.com'),
    User(name='李四', email='lisi@test.com'),
])
session.commit()

# 查詢并打印
for user in session.query(User).all():
    print(user)

session.close()

五、踩過的幾個坑

坑1:方言包放錯位置

這是最容易犯的錯。方言包必須放在sqlalchemy/dialects/kingbase/,不是隨便扔到site-packages就行。

坑2:版本不對應(yīng)

SQLAlchemy 1.4的版本要用1.4的方言包。拿1.3的方言包去連1.4的SQLAlchemy,會報模塊找不到的錯誤。

坑3:libkci.so找不到

報錯信息是libkci.so: cannot open shared object file。設(shè)置一下環(huán)境變量就能解決:

export LD_LIBRARY_PATH=/home/kingbase/lib:$LD_LIBRARY_PATH

坑4:連接字符串寫錯

kingbase://不要寫成kingbase+psycopg2://,雖然ksycopg2基于psycopg2改的,但名字寫錯了就是連不上。

六、小結(jié)

折騰下來,SQLAlchemy連金倉其實不算復(fù)雜,就是方言包要手動配置這一點跟其他數(shù)據(jù)庫不一樣。

整體流程分三步:

  1. 裝SQLAlchemy和ksycopg2
  2. 把金倉方言包放到sqlalchemy/dialects/下面
  3. kingbase://開頭的連接字符串創(chuàng)建engine

ORM操作和連其他數(shù)據(jù)庫一模一樣,基本不用改代碼。如果項目里用SQLAlchemy做ORM,切換成本其實挺低的。

到此這篇關(guān)于SQLAlchemy編寫的MySQL數(shù)據(jù)庫遷移至金倉數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān)MySQL遷移至金倉數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解hive常見表結(jié)構(gòu)

    詳解hive常見表結(jié)構(gòu)

    hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,用來進(jìn)行數(shù)據(jù)提取、轉(zhuǎn)化、加載,這是一種可以存儲、查詢和分析存儲在Hadoop中的大規(guī)模數(shù)據(jù)的機制,這篇文章主要介紹了hive常見表結(jié)構(gòu),需要的朋友可以參考下
    2022-08-08
  • 關(guān)于ADOX的相關(guān)知識

    關(guān)于ADOX的相關(guān)知識

    關(guān)于ADOX的相關(guān)知識...
    2006-12-12
  • Spring集成MyBatis完整實例(分享)

    Spring集成MyBatis完整實例(分享)

    下面小編就為大家?guī)硪黄猄pring集成MyBatis完整實例(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • SQL 隨機查詢 包括(sqlserver,mysql,access等)

    SQL 隨機查詢 包括(sqlserver,mysql,access等)

    SQL 隨機查詢 包括(sqlserver,mysql,access等),需要的朋友可以參考下,目的一般是為了隨機讀取數(shù)據(jù)庫中的記錄。
    2009-10-10
  • 利用DataSet部分功能實現(xiàn)網(wǎng)站登錄

    利用DataSet部分功能實現(xiàn)網(wǎng)站登錄

    這篇文章主要介紹了利用DataSet部分功能實現(xiàn)網(wǎng)站登錄 ,需要的朋友可以參考下
    2017-05-05
  • 實例介紹SQL注入以及如何解決

    實例介紹SQL注入以及如何解決

    這篇文章主要給大家介紹了關(guān)于SQL注入以及如何解決的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 動態(tài)SQL在梧桐數(shù)據(jù)庫的使用方法及適應(yīng)場景

    動態(tài)SQL在梧桐數(shù)據(jù)庫的使用方法及適應(yīng)場景

    這篇文章主要介紹了動態(tài)SQL在梧桐數(shù)據(jù)庫的使用方法及適應(yīng)場景,通過簡單的例子展示了如何在梧桐數(shù)據(jù)庫中使用動態(tài)SQL,動態(tài)SQL可以靈活處理不同量的輸入?yún)?shù),提升查詢效率,但也會增加代碼調(diào)試的難度,適用場景包括處理不確定的參數(shù)、通過輸入生成其他參數(shù)以及在for循環(huán)中使用
    2024-11-11
  • windows安裝Neo4j圖數(shù)據(jù)庫的詳細(xì)過程

    windows安裝Neo4j圖數(shù)據(jù)庫的詳細(xì)過程

    本文介紹了在Windows上安裝和配置Neo4j圖數(shù)據(jù)庫的步驟,包括安裝JavaSDK、解壓安裝Neo4j、配置環(huán)境變量、啟動數(shù)據(jù)庫以及服務(wù)化啟動,感興趣的朋友一起看看吧
    2025-03-03
  • SQLSERVER 高級復(fù) 制 排錯 技巧

    SQLSERVER 高級復(fù) 制 排錯 技巧

    SQLSERVER 高級復(fù) 制 排錯 技巧...
    2007-08-08
  • Access和SQL Server里面的SQL語句的不同之處

    Access和SQL Server里面的SQL語句的不同之處

    做了一個Winform的營養(yǎng)測量軟件,來回的搗騰著Access數(shù)據(jù)庫,還是那幾句增刪改查,不過用多了,發(fā)現(xiàn)Access數(shù)據(jù)庫下的SQL語句和SQL Server下正宗的SQL還有有很大的不同。
    2009-12-12

最新評論

运城市| 大连市| 信丰县| 宿迁市| 东源县| 夹江县| 治多县| 延吉市| 慈溪市| 玉山县| 商丘市| 吉首市| 扬州市| 铁力市| 景谷| 襄汾县| 东乡族自治县| 郸城县| 通州市| 鸡泽县| 奉节县| 邵阳县| 石城县| 黔南| 华坪县| 岑溪市| 晋中市| 乐山市| 莒南县| 北京市| 惠东县| 富川| 宜阳县| 台南市| 金阳县| 商都县| 鹤山市| 阳原县| 柘荣县| 洪雅县| 金昌市|