Python脚本如何操作数据库同义词

wen 实用脚本 1

本文目录导读:

Python脚本如何操作数据库同义词

  1. 使用cx_Oracle操作Oracle同义词
  2. 使用SQLAlchemy操作同义词
  3. 使用pymssql操作SQL Server同义词
  4. 完整的封装类示例
  5. 注意事项

我来详细介绍Python操作数据库同义词(Synonym)的几种方法:

使用cx_Oracle操作Oracle同义词

安装依赖

pip install cx_Oracle

创建和查询同义词

import cx_Oracle
# 连接数据库
connection = cx_Oracle.connect(
    user="username",
    password="password",
    dsn="host:port/service_name"
)
cursor = connection.cursor()
# 创建同义词
create_synonym = """
CREATE PUBLIC SYNONYM emp_syn 
FOR hr.employees
"""
cursor.execute(create_synonym)
# 通过同义词查询数据
cursor.execute("SELECT * FROM emp_syn WHERE ROWNUM <= 5")
for row in cursor.fetchall():
    print(row)
# 删除同义词
drop_synonym = "DROP PUBLIC SYNONYM emp_syn"
cursor.execute(drop_synonym)
connection.commit()
cursor.close()
connection.close()

查询已有同义词

# 查询所有同义词
cursor.execute("""
    SELECT * FROM ALL_SYNONYMS 
    WHERE OWNER = 'PUBLIC'
""")
for synonym in cursor.fetchall():
    print(f"同义词名: {synonym[1]}, 对应表: {synonym[2]}.{synonym[3]}")
# 查询特定同义词
cursor.execute("""
    SELECT * FROM ALL_SYNONYMS 
    WHERE SYNONYM_NAME = 'EMP_SYN'
""")

使用SQLAlchemy操作同义词

安装依赖

pip install sqlalchemy cx_Oracle

配置和使用

from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker
import urllib.parse
# 连接字符串
dsn = cx_Oracle.makedsn('host', port, service_name='service_name')
conn_str = f'oracle+cx_oracle://username:{urllib.parse.quote("password")}@{dsn}'
# 创建引擎
engine = create_engine(conn_str, echo=True)
# 通过同义词查询
with engine.connect() as conn:
    result = conn.execute(text("SELECT * FROM emp_syn WHERE ROWNUM <= 5"))
    for row in result:
        print(row)
# 创建同义词
with engine.connect() as conn:
    conn.execute(text("""
        CREATE OR REPLACE PUBLIC SYNONYM dept_syn 
        FOR hr.departments
    """))
    conn.commit()

使用pymssql操作SQL Server同义词

安装依赖

pip install pymssql

操作示例

import pymssql
# 连接数据库
conn = pymssql.connect(
    server='host',
    user='username',
    password='password',
    database='dbname'
)
cursor = conn.cursor()
# 创建同义词
cursor.execute("""
    CREATE SYNONYM emp_syn 
    FOR HR.dbo.employees
""")
# 查询系统同义词
cursor.execute("""
    SELECT * FROM sys.synonyms 
    WHERE name = 'emp_syn'
""")
# 使用同义词
cursor.execute("SELECT * FROM emp_syn")
rows = cursor.fetchall()
conn.commit()
conn.close()

完整的封装类示例

import cx_Oracle
from typing import List, Tuple, Optional
class SynonymManager:
    """数据库同义词管理器"""
    def __init__(self, connection_string: str):
        self.connection = cx_Oracle.connect(connection_string)
        self.cursor = self.connection.cursor()
    def create_synonym(self, 
                      synonym_name: str, 
                      target_table: str, 
                      is_public: bool = False,
                      replace: bool = False) -> bool:
        """创建同义词"""
        try:
            public_clause = "PUBLIC" if is_public else ""
            replace_clause = "OR REPLACE" if replace else ""
            sql = f"""
                CREATE {replace_clause} {public_clause} 
                SYNONYM {synonym_name} 
                FOR {target_table}
            """
            self.cursor.execute(sql)
            self.connection.commit()
            return True
        except Exception as e:
            print(f"创建同义词失败: {e}")
            return False
    def drop_synonym(self, 
                    synonym_name: str, 
                    is_public: bool = False) -> bool:
        """删除同义词"""
        try:
            public_clause = "PUBLIC" if is_public else ""
            sql = f"DROP {public_clause} SYNONYM {synonym_name}"
            self.cursor.execute(sql)
            self.connection.commit()
            return True
        except Exception as e:
            print(f"删除同义词失败: {e}")
            return False
    def list_synonyms(self, owner: Optional[str] = None) -> List[Tuple]:
        """列出同义词"""
        query = """
            SELECT owner, synonym_name, table_owner, table_name, db_link
            FROM all_synonyms
        """
        if owner:
            query += f" WHERE owner = '{owner}'"
        self.cursor.execute(query)
        return self.cursor.fetchall()
    def query_via_synonym(self, 
                         synonym_name: str, 
                         columns: str = "*",
                         where_clause: Optional[str] = None,
                         limit: int = 100) -> List[Tuple]:
        """通过同义词查询数据"""
        query = f"SELECT {columns} FROM {synonym_name}"
        if where_clause:
            query += f" WHERE {where_clause}"
        if limit:
            query += f" AND ROWNUM <= {limit}"
        self.cursor.execute(query)
        return self.cursor.fetchall()
    def close(self):
        """关闭连接"""
        self.cursor.close()
        self.connection.close()
# 使用示例
def main():
    # 初始化
    conn_str = "username/password@host:port/service_name"
    manager = SynonymManager(conn_str)
    try:
        # 创建同义词
        success = manager.create_synonym(
            synonym_name="emp_syn",
            target_table="hr.employees",
            is_public=True,
            replace=True
        )
        print(f"创建同义词: {'成功' if success else '失败'}")
        # 列出同义词
        synonyms = manager.list_synonyms(owner="PUBLIC")
        for syn in synonyms:
            print(f"同义词: {syn[1]}, 指向: {syn[2]}.{syn[3]}")
        # 查询数据
        employees = manager.query_via_synonym(
            synonym_name="emp_syn",
            columns="employee_id, first_name, salary",
            limit=10
        )
        for emp in employees:
            print(emp)
    finally:
        manager.close()
if __name__ == "__main__":
    main()

注意事项

  1. 权限要求:创建同义词需要相应权限,如Oracle中需要CREATE SYNONYMCREATE PUBLIC SYNONYM权限。

  2. 连接池:生产环境建议使用连接池:

    from sqlalchemy.pool import QueuePool

pool = QueuePool( creator=lambda: cx_Oracle.connect(conn_str), pool_size=5, max_overflow=10 )


3. **事务管理**:DML操作需要事务管理:
```python
try:
    # 执行操作
    connection.commit()
except Exception as e:
    connection.rollback()
    raise e
  1. 错误处理:添加适当的错误处理机制:
    try:
     cursor.execute(sql)
    except cx_Oracle.DatabaseError as e:
     error_obj, = e.args
     print(f"Oracle错误代码: {error_obj.code}")
     print(f"Oracle错误信息: {error_obj.message}")

这样你就可以在Python中灵活地操作数据库同义词了。

抱歉,评论功能暂时关闭!