1. 程式人生 > >在MacOS下使用sqlalchemy 連接sqlserver2012 數據庫

在MacOS下使用sqlalchemy 連接sqlserver2012 數據庫

install scott esc 可能 etc lin not null with

在MacOS下使用sqlalchemy 連接sqlserver 數據庫

前言

最近有要求,要將數據庫換成巨硬家的sqlserver 2012 因為在網上苦苦找不到sqlalchemy 配置連接SqlServer的具體中文步驟,翻了官方文檔後把步驟整理出來

前期準備

已經安裝好sqlalchemy

運行環境介紹

系統:MacOS 10.13.1 Beta Python 環境: 3.6.0 sqlalchemy 1.1.4 pycode 4.0.19 sqlserver 2012

實施步驟

在sqlalchemy裏對於連接sqlserver 是這樣介紹的 原文地址http://docs.sqlalchemy.org/en/latest/core/engines.html#sqlalchemy.create_engine

Microsoft SQL Server

The SQL Server dialect uses pyodbc as the default DBAPI. pymssql is also available:

pyodbc

engine = create_engine(‘mssql+pyodbc://scott:tiger@mydsn‘)

pymssql

engine = create_engine(‘mssql+pymssql://scott:tiger@hostname:port/dbname‘)

因此要想使用sqlalchemy 先要配置pyodbc正常使用

安裝 pyodbc

如果覺得太慢的話可以後面使用加 -i 參數選擇國內源 比如豆瓣

pip3 install pyodbc

pip install pyodbc

配置pyodbc

在Mac os 下pyodbc不是僅僅安裝上就可以使用的還需要一些配置才可以 關於pyodbc的官方文檔見https://github.com/mkleehammer/pyodbc/wiki

Macos 配置文檔見https://github.com/mkleehammer/pyodbc/wiki/Connecting-to-SQL-Server-from-Mac-OSX

以下是對文檔中步驟的大致翻譯

安裝Install FreeTDS and unixODBC 使用Mac 上的命令行軟件安裝工具

brew update
brew install unixodbc
brew install freetds --with-unixodbc

遇到的坑

在安裝過程中有可能因為網絡原因導致下載的包不完整導致報類似SHA256 Checksum mismatch 的錯誤,只要根據提示到到下載路徑刪除掉不完整的包就可以了

Treetds 配置

使用命令得到freetds.conf的位置

tsql -C

然後在這個文件的後面追加自己的sql server 配置

例如:

[MYMSSQL]
host = mssqlhost.xyz.com
port = 1433
tds version = 7.3

關於不同的數據庫與對於的tds version看下面http://www.freetds.org/userguide/choosingtdsprotocol.htm通過上面的配置 mac就可以和SqlServer服務器連接上了,可以使用下面的命令連接進入到sql命令行狀態

tsql -S MYMSSQL -U myuser -P mypassword

MYMSSQL 在配置文件總給一個數據庫連接起的名字

myuser 連接用的用戶

mypassword 用戶對應的密碼

連接成功後的狀態

locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
1>

可以使用一條sql語句測試一下例如"SELECT @@VERSION"

註意輸入完sql語句後 在下一行(enter)輸入go才會執行

編輯odbcinst.ini 和 odbc.ini 配置文件

通過命令來 獲取odbcinst.ini 和odbc.ini的文件位置

odbcinst -j

將如下內容寫入odbcinst.ini

[FreeTDS]
Description=FreeTDS Driver for Linux & MSSQL
Driver=/usr/local/lib/libtdsodbc.so
Setup=/usr/local/lib/libtdsodbc.so
UsageCount=1

將如下內容寫入odbc.ini

[MYMSSQL]
Description         = Test to SQLServer
Driver              = FreeTDS
Servername          = MYMSSQL

註意這裏的 Servername 就是freetds.conf中配置的名字

接著輸入

isql MYMSSQL myuser mypassword

可以輸入一些sql語句測試一下

示例代碼

通過pyodbc連接數據庫
import pyodbc
# the DSN value should be the name of the entry in odbc.ini, not freetds.conf
#將myuser 和mypassword 自己環境中的
conn = pyodbc.connect(‘DSN=MYMSSQL;UID=myuser;PWD=mypassword‘)
crsr = conn.cursor()
rows = crsr.execute("select @@VERSION").fetchall()
print(rows)
crsr.close()
conn.close()

如果能出現結果證明連接正常

通過sqlalchemy 操作數據庫 例如創建一張表

#!/usr/bin/env python3
import pyodbc,sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql import sqltypes

ENGINE = create_engine(‘mssql+pyodbc://admin:123456@MYMSSQL‘)
Base = declarative_base()
class Userinfo(Base):
    __tablename__ = ‘userinfo‘
    id = Column(Integer, primary_key=True, autoincrement=True)
    account_id = Column(String(255), nullable=False)
    username = Column(String(255),nullable=False)
    encrypted_password = Column(sqltypes.VARBINARY(500), nullable=False)
    token = Column(String(255))

def init_db():
    Base.metadata.create_all(ENGINE)

def drop_db():
    Base.metadata.drop_all(ENGINE)

def session():
    cls = sessionmaker(bind=ENGINE)
    return cls()
#drop_db()
init_db()

在MacOS下使用sqlalchemy 連接sqlserver2012 數據庫