

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 變更 Python 和 Perl 應用程式，以支援從 Microsoft SQL Server 到 Amazon Aurora PostgreSQL 相容版本的資料庫遷移
<a name="change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition"></a>

*Dwarika Patra 和 Deepesh Jayaprakash，Amazon Web Services*

## 總結
<a name="change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition-summary"></a>

此模式說明將資料庫從 Microsoft SQL Server 遷移至 Amazon Aurora PostgreSQL 相容版本時可能需要的應用程式儲存庫變更。模式假設這些應用程式是以 Python 為基礎或以 Perl 為基礎，並提供這些指令碼語言的個別指示。

將 SQL Server 資料庫遷移至 Aurora PostgreSQL 相容包含結構描述轉換、資料庫物件轉換、資料遷移和資料載入。由於 PostgreSQL 和 SQL Server 之間的差異 （與資料類型、連線物件、語法和邏輯相關），最困難的遷移任務涉及對程式碼基礎進行必要的變更，以便能夠正確搭配 PostgreSQL 使用。

對於 Python 型應用程式，連線物件和類別會分散在整個系統中。此外，Python 程式碼庫可能會使用多個程式庫來連線至資料庫。如果資料庫連線界面變更，執行應用程式內嵌查詢的物件也需要變更。

對於 Perl 型應用程式，變更涉及連線物件、資料庫連線驅動程式、靜態和動態內嵌 SQL 陳述式，以及應用程式如何處理複雜的動態 DML 查詢和結果集。

遷移應用程式時，您也可以考慮 AWS 上可能的增強功能，例如將 FTP 伺服器取代為 Amazon Simple Storage Service (Amazon S3) 存取。

應用程式遷移程序涉及下列挑戰：
+ 連線物件。如果連線物件分散在具有多個程式庫和函數呼叫的程式碼中，您可能需要找到一種一般方法來變更它們以支援 PostgreSQL。
+ 在記錄擷取或更新期間處理錯誤或例外狀況。如果您在傳回變數、結果集或資料影格的資料庫上有條件式建立、讀取、更新和刪除 (CRUD) 操作，任何錯誤或例外狀況都可能導致具有層疊效果的應用程式錯誤。這些應該透過適當的驗證和儲存點仔細處理。其中一個儲存點是在`BEGIN...EXCEPTION...END`區塊內呼叫大型內嵌 SQL 查詢或資料庫物件。
+ 控制交易及其驗證。這些包括手動和自動遞交和轉返。適用於 Perl 的 PostgreSQL 驅動程式需要您一律明確設定自動遞交屬性。
+ 處理動態 SQL 查詢。這需要深入了解查詢邏輯和反覆測試，以確保查詢如預期般運作。
+ 效能。您應該確保程式碼變更不會導致應用程式效能降低。

此模式會詳細說明轉換程序。

## 先決條件和限制
<a name="change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition-prereqs"></a>

**先決條件**
+ Python 和 Perl 語法的工作知識。
+ SQL Server 和 PostgreSQL 中的基本技能。
+ 了解您現有的應用程式架構。
+ 存取您的應用程式碼、SQL Server 資料庫和 PostgreSQL 資料庫。
+ 使用用於開發、測試和驗證應用程式變更的登入資料來存取 Windows 或 Linux （或其他 Unix) 開發環境。
+ 對於 Python 型應用程式，您的應用程式可能需要的標準 Python 程式庫，例如 **Pandas** 來處理資料影格，以及 **psycopg2** 或 **SQLAlchemy** 用於資料庫連線。
+ 對於 Perl 型應用程式，需要具有相依程式庫或模組的 Perl 套件。Comprehensive Perl Archive Network (CPAN) 模組可支援大多數應用程式需求。
+ 所有必要的相依自訂程式庫或模組。 
+ 用於 SQL Server 讀取存取和 Aurora 讀取/寫入存取的資料庫登入資料。
+ PostgreSQL 使用 服務和使用者來驗證和偵錯應用程式變更。
+ 在應用程式遷移期間存取開發工具，例如 Visual Studio Code、Sublime Text 或 **pgAdmin**。

**限制**
+ 有些 Python 或 Perl 版本、模組、程式庫和套件與雲端環境不相容。
+ 某些用於 SQL Server 的第三方程式庫和架構無法取代，以支援 PostgreSQL 遷移。 
+ 效能變化可能需要變更您的應用程式、內嵌 Transact-SQL (T-SQL) 查詢、資料庫函數和預存程序。
+ PostgreSQL 支援資料表名稱、資料欄名稱和其他資料庫物件的小寫名稱。 
+ 有些資料類型，例如 UUID 資料欄，只會以小寫儲存。Python 和 Perl 應用程式必須處理此類案例差異。 
+ 角色編碼差異必須使用 PostgreSQL 資料庫中對應文字資料欄的正確資料類型來處理。                               

**產品版本**
+ Python 3.6 或更新版本 （使用支援您作業系統的版本）
+ Perl 5.8.3 或更新版本 （使用支援您作業系統的 版本）
+ Aurora PostgreSQL 相容版本 4.2 或更新版本 （請參閱[詳細資訊](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.Updates.20180305.html#AuroraPostgreSQL.Updates.20180305.42))

## Architecture
<a name="change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition-architecture"></a>

**來源技術堆疊**
+ 指令碼 （應用程式程式設計） 語言：Python 2.7 或更新版本，或 Perl 5.8 
+ 資料庫：Microsoft SQL Server 第 13 版
+ 作業系統：Red Hat Enterprise Linux (RHEL) 7 

**目標技術堆疊**
+ 指令碼 （應用程式程式設計） 語言：Python 3.6 或更新版本，或 Perl 5.8 或更新版本 
+ 資料庫：Aurora PostgreSQL 相容 4.2
+ 作業系統：RHEL 7 

**遷移架構**

![\[使用 SQL Server 將 Perl 或 Python 應用程式遷移至 Aurora PostgreSQL 相容\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/b64de64a-bd55-4db7-ba7b-0a2557862af1/images/b8fab3e2-ded5-4f58-86bf-3f645252e9fc.png)


## 工具
<a name="change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition-tools"></a>

**AWS 服務和工具**
+ [Aurora PostgreSQL 相容版本](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)是全受管、PostgreSQL 相容且符合 ACID 規範的關聯式資料庫引擎，結合了高階商業資料庫的速度和可靠性，以及開放原始碼資料庫的成本效益。Aurora PostgreSQL 是 PostgreSQL 的下拉式選單，可讓您更輕鬆且更具成本效益地設定、操作和擴展新的和現有的 PostgreSQL 部署。
+ [AWS Command Line Interface (AWS CLI) ](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)是一種開放原始碼工具，可讓您在命令列 Shell 中使用命令與 AWS 服務互動。

**其他工具**
+ [Python](https://www.python.org/) 和 PostgresSQL 資料庫連線程式庫，例如 [psycopg2](https://pypi.org/project/psycopg2/) 和 [SQLAlchemy](https://www.sqlalchemy.org/)
+ [Perl](https://www.perl.org/) 及其 [DBI 模組](https://metacpan.org/pod/DBD::Pg)
+ [PostgreSQL 互動式終端機](https://www.postgresql.org/docs/13/app-psql.html) (psql)

## 史詩
<a name="change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition-epics"></a>

### 將您的應用程式儲存庫遷移至 PostgreSQL – 高階步驟
<a name="migrate-your-application-repository-to-postgresql-ndash-high-level-steps"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 請依照這些程式碼轉換步驟，將您的應用程式遷移至 PostgreSQL。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition.html)下列語意提供適用於 Python 和 Perl 應用程式的一些轉換任務的詳細說明。 | 應用程式開發人員 | 
| 針對遷移的每個步驟使用檢查清單。 | 將以下內容新增至應用程式遷移每個步驟的檢查清單，包括最後一個步驟：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition.html) | 應用程式開發人員 | 

### 分析和更新您的應用程式 – Python 程式碼基底
<a name="analyze-and-update-your-application-ndash-python-code-base"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 分析您現有的 Python 程式碼庫。 | 您的分析應包含下列項目，以促進應用程式遷移程序：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition.html) | 應用程式開發人員 | 
| 轉換資料庫連線以支援 PostgreSQL。 | 大多數 Python 應用程式使用 **pyodbc** 程式庫來連接 SQL Server 資料庫，如下所示。<pre>import pyodbc<br />....<br />try:<br />    conn_string = "Driver=ODBC Driver 17 for SQL<br />    Server;UID={};PWD={};Server={};Database={}".format (conn_user, conn_password,<br />    conn_server, conn_database)<br />    conn = pyodbc.connect(conn_string)<br />    cur = conn.cursor()<br />    result = cur.execute(query_string)<br />    for row in result:<br />    print (row)<br />except Exception as e:<br />    print(str(e))</pre>轉換資料庫連線以支援 PostgreSQL，如下所示。<pre>import pyodbc<br />import psycopg2<br />....<br />try:<br />    conn_string = ‘postgresql+psycopg2://’+<br />    conn_user+’:’+conn_password+’@’+conn_server+’/’+conn_database<br />    conn = pyodbc.connect(conn_string, connect_args={‘options’:’-csearch_path=dbo’})<br />    cur = conn.cursor()<br />    result = cur.execute(query_string)<br />    for row in result:<br />    print (row)<br />except Exception as e:<br />    print(str(e))</pre> | 應用程式開發人員 | 
| 將內嵌 SQL 查詢變更為 PostgreSQL。 | 將您的內嵌 SQL 查詢轉換為 PostgreSQL 相容格式。例如，下列 SQL Server 查詢會從資料表擷取字串。<pre>dtype = "type1"<br />stm = ‘"SELECT TOP 1 searchcode FROM TypesTable (NOLOCK)<br />WHERE code="’ + "’" + str(dtype) + "’"<br /># For Microsoft SQL Server Database Connection<br />engine = create_engine(‘mssql+pyodbc:///?odbc_connect=%s’ % urllib.parse.quote_plus(conn_string), connect_args={‘connect_timeout’:login_timeout})<br />conn = engine_connect()<br />rs = conn.execute(stm)<br />for row in rs:<br />    print(row)</pre>轉換後，與 PostgreSQL 相容的內嵌 SQL 查詢如下所示。<pre>dtype = "type1"<br />stm = ‘"SELECT searchcode FROM TypesTable<br />WHERE code="’ + "’" + str(dtype) + "’ LIMIT 1"<br /># For PostgreSQL Database Connection<br />engine = create_engine(‘postgres+psycopg2://%s’ %conn_string, connect_args={‘connect_timeout’:login_timeout})<br />conn = engine.connect()<br />rs = conn.execute(stm)<br />for row in rs:<br />    print(row)</pre> | 應用程式開發人員 | 
| 處理動態 SQL 查詢。 | 動態 SQL 可以存在於一個指令碼或多個 Python 指令碼中。先前範例示範如何使用 Python 的字串取代函數插入變數來建構動態 SQL 查詢。替代方法是在適用的情況下，使用變數附加查詢字串。 在下列範例中，查詢字串會根據函數傳回的值，以即時方式建構。<pre>query = ‘"SELECT id from equity e join issues i on e.permId=i.permId where e.id’"<br />query += get_id_filter(ids) + " e.id is NOT NULL</pre>這些類型的動態查詢在應用程式遷移期間非常常見。請依照下列步驟處理動態查詢：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition.html) | 應用程式開發人員 | 
| 處理結果集、變數和資料影格。 | 對於 Microsoft SQL Server，您可以使用 Python 方法，例如 `fetchall()``fetchone()`或 從資料庫擷取結果集。您也可以使用 `fetchmany(size)`並指定要從結果集傳回的記錄數目。若要這樣做，您可以使用 **pyodbc** 連線物件，如下列範例所示。**pyodbc (Microsoft SQL Server)**<pre>import pyodbc <br />server = 'tcp:myserver.database.windows.net' <br />database = 'exampledb' <br />username = 'exampleusername' <br />password = 'examplepassword' <br />conn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)<br />cursor = conn.cursor()<br />cursor.execute("SELECT * FROM ITEMS") <br />row = cursor.fetchone() <br />while row: <br />    print(row[0])<br />    row = cursor.fetchone()</pre>在 Aurora 中，若要執行類似任務，例如連線至 PostgreSQL 和擷取結果集，您可以使用 **psycopg2** 或 **SQLAlchemy**。這些 Python 程式庫提供連線模組和游標物件，以周遊 PostgreSQL 資料庫記錄，如下列範例所示。**psycopg2 (Aurora PostgreSQL 相容）**<pre>import psycopg2<br />query = "SELECT * FROM ITEMS;"<br />//Initialize variables<br />host=dbname=user=password=port=sslmode=connect_timeout=""<br />connstring = "host='{host}' dbname='{dbname}' user='{user}' \<br />password='{password}'port='{port}'".format(host=host,dbname=dbname,\<br />user=user,password=password,port=port) <br />conn = psycopg2.connect(connstring)<br />cursor = conn.cursor()<br />cursor.execute(query)<br />column_names = [column[0] for column in cursor.description]<br />print("Column Names: ", column_names)<br />print("Column values: "<br />for row in cursor:<br />    print("itemid :", row[0])<br />    print("itemdescrption :", row[1])<br />    print("itemprice :", row[3]))</pre>**SQLAlchemy (Aurora PostgreSQL 相容）**<pre>from sqlalchemy import create_engine<br />from pandas import DataFrame<br />conn_string = 'postgresql://core:database@localhost:5432/exampledatabase'<br />engine = create_engine(conn_string)<br />conn = engine.connect()<br />dataid = 1001<br />result = conn.execute("SELECT * FROM ITEMS")<br />df = DataFrame(result.fetchall())<br />df.columns = result.keys()<br />df = pd.DataFrame()<br />engine.connect()<br />df = pd.read_sql_query(sql_query, engine, coerce_float=False)<br />print("df=", df)</pre> | 應用程式開發人員 | 
| 在遷移期間和之後測試您的應用程式。 | 測試遷移的 Python 應用程式是持續進行的程序。由於遷移包含連線物件變更 (**psycopg2** 或 **SQLAlchemy**)、錯誤處理、新功能 （資料框架）、內嵌 SQL 變更、大量複製功能 (`bcp`而非 `COPY`) 和類似變更，因此必須在應用程式遷移期間和之後仔細測試。檢查：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition.html) | 應用程式開發人員 | 

### 分析和更新您的應用程式 – Perl 程式碼庫
<a name="analyze-and-update-your-application-ndash-perl-code-base"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 分析現有的 Perl 程式碼基底。 | 您的分析應包含下列項目，以促進應用程式遷移程序。您應該識別：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition.html) | 應用程式開發人員 | 
| 轉換 Perl 應用程式和 DBI 模組的連線，以支援 PostgreSQL。 | Perl 型應用程式通常會使用 Perl DBI 模組，這是 Perl 程式設計語言的標準資料庫存取模組。您可以使用相同的 DBI 模組搭配 SQL Server 和 PostgreSQL 的不同驅動程式。如需必要 Perl 模組、安裝和其他說明的詳細資訊，請參閱 [DBD：：Pg 文件](https://metacpan.org/pod/DBD::Pg)。下列範例會連線至位於 的 Aurora PostgreSQL 相容`exampletest-aurorapg-database.cluster-sampleclusture.us-east.-rds.amazonaws.com`。<pre>#!/usr/bin/perl<br />use DBI;<br />use strict;<br />my $driver = "Pg";<br />my $hostname = "exampletest-aurorapg-database-sampleclusture.us-east.rds.amazonaws.com"<br />my $dsn = "DBI:$driver: dbname = $hostname;host = 127.0.0.1;port = 5432";<br />my $username = "postgres";<br />my $password = "pass123";<br />$dbh = DBI->connect("dbi:Pg:dbname=$hostname;host=$host;port=$port;options=$options",<br />      $username,<br />      $password,<br />      {AutoCommit => 0, RaiseError => 1, PrintError => 0}<br />      );</pre> | 應用程式開發人員 | 
| 將內嵌 SQL 查詢變更為 PostgreSQL。 | 您的應用程式可能有具有 `SELECT`、`UPDATE`、 `DELETE`和類似陳述式的內嵌 SQL 查詢，其中包含 PostgreSQL 不支援的查詢子句。例如，PostgreSQL `NOLOCK` 不支援查詢關鍵字，例如 `TOP`和 。下列範例示範如何處理 `TOP`、 `NOLOCK`和布林值變數。在 SQL Server 中：<pre>$sqlStr = $sqlStr<br />. "WHERE a.student_id in (SELECT TOP $numofRecords c_student_id   \<br />FROM active_student_record b WITH (NOLOCK) \<br />INNER JOIN student_contributor c WITH (NOLOCK) on c.contributor_id = b.c_st)</pre>對於 PostgreSQL，請轉換為：<pre>$sqlStr = $sqlStr<br />. "WHERE a.student_id in (SELECT TOP $numofRecords c_student_id  \<br />FROM active_student_record b INNER JOIN student_contributor c  \<br />on c.contributor_id = b.c_student_contr_id WHERE b_current_1 is true \<br />LIMIT $numofRecords)"</pre> | 應用程式開發人員 | 
| 處理動態 SQL 查詢和 Perl 變數。 | 動態 SQL 查詢是在應用程式執行時間建置的 SQL 陳述式。這些查詢會在應用程式執行時動態建構，視特定條件而定，因此在執行時間之前，不會知道查詢的全文。例如，財務分析應用程式每天分析前 10 個共享，這些共享每天都會變更。SQL 資料表是根據最佳執行者建立的，在執行時間之前不會知道這些值。假設此範例的內嵌 SQL 查詢會傳遞至包裝函式，以取得變數中設定的結果，然後變數會使用條件來判斷資料表是否存在：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition.html)以下是變數處理的範例，後面接著此使用案例的 SQL Server 和 PostgreSQL 查詢。<pre>my $tableexists = db_read( arg 1, $sql_qry, undef, 'writer');<br />my $table_already_exists = $tableexists->[0]{table_exists};<br />if ($table_already_exists){<br /># do some thing<br />}<br />else {<br /># do something else<br />}</pre>SQL Server：<pre>my $sql_qry = "SELECT OBJECT_ID('$backendTable', 'U') table_exists", undef, 'writer')";</pre>PostgreSQL：<pre>my $sql_qry = "SELECT TO_REGCLASS('$backendTable', 'U') table_exists", undef, 'writer')";</pre>下列範例使用內嵌 SQL 中的 ****Perl 變數，該變數會搭配 執行`SELECT`陳述式`JOIN`，以擷取資料表的主索引鍵和索引鍵資料欄的位置。SQL Server：<pre>my $sql_qry = "SELECT column_name', character_maxi mum_length \<br />FROM INFORMATION_SCHEMA.COLUMNS \<br />WHERE TABLE_SCHEMA='$example_schemaInfo' \<br />AND TABLE_NAME='$example_table' \<br />AND DATA_TYPE IN ('varchar','nvarchar');";</pre>PostgreSQL：<pre>my $sql_qry = "SELECT c1.column_name, c1.ordinal_position \<br />FROM information_schema.key_column_usage AS c LEFT \<br />JOIN information_schema.table_constraints AS t1 \<br />ON t1.constraint_name = c1.constraint_name \<br />WHERE t1.table_name = $example_schemaInfo'.'$example_table’ \<br />AND t1.constraint_type = 'PRIMARY KEY' ;";</pre> | 應用程式開發人員 | 

### 對 Perl 型或 Python 型應用程式進行其他變更，以支援 PostgreSQL
<a name="make-additional-changes-to-your-perl-based-or-python-based-application-to-support-postgresql"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將其他 SQL Server 建構轉換為 PostgreSQL。 | 下列變更適用於所有應用程式，無論程式設計語言為何。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition.html) | 應用程式開發人員 | 

### 改善效能
<a name="improve-performance"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 利用 AWS 服務來增強效能。 | 當您遷移至 AWS 雲端時，您可以精簡應用程式和資料庫設計，以利用 AWS 服務。例如，如果連接至 Aurora PostgreSQL 相容資料庫伺服器的 Python 應用程式查詢花費的時間比原始 Microsoft SQL Server 查詢更長，您可以考慮直接從 Aurora 伺服器建立歷史資料的摘要至 Amazon Simple Storage Service (Amazon S3) 儲存貯體，並使用 Amazon Athena 型 SQL 查詢來產生使用者儀表板的報告和分析資料查詢。 | 應用程式開發人員、雲端架構師 | 

## 相關資源
<a name="change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition-resources"></a>
+ [Perl](https://www.perl.org/)
+ [Perl DBI 模組](https://metacpan.org/pod/DBI)
+ [Python](https://www.python.org/)
+ [psycopg2](https://pypi.org/project/psycopg2/)
+ [SQLAlchemy](https://www.sqlalchemy.org/)
+ [大量複製 - PostgreSQL](https://www.postgresql.org/docs/9.2/sql-copy.html)
+ [大量複製 - Microsoft SQL Server](https://docs.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-ver15)
+ [PostgreSQL](https://www.postgresql.org/)
+ [使用 Amazon Aurora PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)

## 其他資訊
<a name="change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition-additional"></a>

Microsoft SQL Server 和 Aurora PostgreSQL 相容都是 ANSI SQL 投訴。不過，當您將 Python 或 Perl 應用程式從 SQL Server 遷移至 PostgreSQL 時，仍應注意語法、資料欄資料類型、原生資料庫特定函數、大量插入和區分大小寫方面的任何不相容。

以下各節提供有關可能的不一致的詳細資訊。

**資料類型比較**

從 SQL Server 到 PostgreSQL 的資料類型變更，可能會導致應用程式操作所產生資料的顯著差異。如需資料類型的比較，請參閱 [Sqlines 網站上的](https://www.sqlines.com/sql-server-to-postgresql) 資料表。

**原生或內建 SQL 函數**

某些函數的行為在 SQL Server 和 PostgreSQL 資料庫之間有所不同。下表提供比較。


| 
| 
| Microsoft SQL Server | Description | PostgreSQL | 
| --- |--- |--- |
| `CAST`  | 將一個值從某個資料類型轉換至另一個類型。 | PostgreSQL `type :: operator` | 
| `GETDATE()` | 以 `YYYY-MM-DD hh:mm:ss.mmm` 格式傳回目前的資料庫系統日期和時間。 | `CLOCK_TIMESTAMP` | 
| `DATEADD` | 將時間/日期間隔新增至日期。 | `INTERVAL` 表達式 | 
| `CONVERT` | 將值轉換為特定資料格式。 | `TO_CHAR` | 
| `DATEDIFF` | 傳回兩個日期之間的差異。 | `DATE_PART` | 
| `TOP` | 限制`SELECT`結果集中的資料列數。 | `LIMIT/FETCH` | 

** 匿名區塊**

結構化 SQL 查詢會組織成數個區段，例如宣告、可執行檔和例外狀況處理。下表比較簡單匿名區塊的 Microsoft SQL Server 和 PostgreSQL 版本。對於複雜的匿名區塊，我們建議您在應用程式中呼叫自訂資料庫函數。


| 
| 
| Microsoft SQL Server | PostgreSQL | 
| --- |--- |
| <pre>my $sql_qry1=<br />my $sql_qry2 =<br />my $sqlqry = "BEGIN TRAN<br />$sql_qry1 $sql_qry2<br />if @\@error !=0 ROLLBACK<br />TRAN<br />else COMIT TRAN";</pre> | <pre>my $sql_qry1=<br />my $sql_qry2 =<br />my $sql_qry = " DO \$\$<br />BEGIN<br />$header_sql $content_sql<br />END<br />\$\$";</pre> | 

 

**其他差異**
+ **大量插入資料列：**相當於 Microsoft SQL Server bcp 公用程式的 PostgreSQL 是 [COPY](https://www.postgresql.org/docs/9.2/sql-copy.html)。 [https://docs.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-ver15](https://docs.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-ver15)
+ **區分大小寫：**PostgreSQL 中的資料欄名稱區分大小寫，因此您必須將 SQL Server 資料欄名稱轉換為小寫或大寫。當您擷取或比較資料，或在結果集或變數中放置資料欄名稱時，這會成為一個因素。下列範例會識別值可能以大寫或小寫儲存的資料欄。

```
my $sql_qry = "SELECT $record_id FROM $exampleTable WHERE LOWER($record_name) = \'failed transaction\'"; 
```
+ **Concatenation：**SQL Server 使用 `+`做為字串串連的運算子，而 PostgreSQL 則使用 `||`。
+ **驗證：**您應該先測試和驗證內嵌 SQL 查詢和函數，再將其用於 PostgreSQL 的應用程式碼。
+ **ORM 程式庫包含 ：**您也可以尋找將現有的資料庫連線程式庫包含或取代為 Python ORM 程式庫，例如 [SQLAlchemy](https://www.sqlalchemy.org/) 和 [PynomoDB](https://pynamodb.readthedocs.io/en/latest/quickstart.html)。這有助於使用物件導向範式，從資料庫輕鬆查詢和操作資料。