mysql欄位資料注釋的遷移 使用python

2021-10-07 19:54:28 字數 3223 閱讀 2954

背景:由於python中的to_sql語句建立的資料庫表沒有字段注釋,而字段又比較多,返回給前端的欄位名是英文,考慮在不建立對映檔案的情況下,為mysql每個字段新增注釋

準備:已經有包含所有字段注釋的sql表,待插入注釋的表與原表大部分欄位名一致,字段型別一致

嘗試:因為所有的字段都可以通過information_schema.columns來檢視,所以考慮使用以下sql

update information_schema.columns as cc 

left join

(select column_name,column_comment from information_schema.columns where table_name = 'origin_table') as tmp

on cc.column_name = tmp.column_name

set cc.column_comment = tmp.column_comment

where cc.table_name = 'new_table'

最後執行結果會報

the target table cc of the update is not updatable
的錯誤

然後單獨 執行

update columns set column_comment = '1' 

where table_name = 'new_table' and column_name = 'new_field'

會報

access denied for user 'root'@'%' to database 'information_schema'
原以為是許可權不足的問題,後來發現我是root使用者,而且許可權都有,最後才知道information_schema是虛擬資料庫,它的存在是類似於檢視一樣,只能查詢不能進行增刪改,當原始記錄發生改變時,該資料庫對應的表會同步發生改變

所以這一條路就走錯了

了解到更改字段注釋的方法是

alter table `table` modify column `field` comment '注釋' -- 不帶型別等

alter table `table` modify column `field` int not null comment '注釋' --帶型別等

alter table `table` modify field field double comment  '注釋'
本次採用第二種辦法

編寫python指令碼

class connection(object):

def mysqlconnect(self, mysqlipaddr, mysqlusername, mysqlpassword, mysqldatabase):

mysql_dbs = pymysql.connect(mysqlipaddr, mysqlusername, mysqlpassword, mysqldatabase) # 連線mysql

engine = create_engine('mysql+pymysql://' + mysqlusername + ':' + mysqlpassword +'@' + mysqlipaddr + '/' + mysqldatabase + '?charset=utf8')

return mysql_dbs, engine

def update_comment(mysqldb, origin_table, tablename):

mysqldb.ping(reconnect=true)

cursor = mysqldb.cursor()

alter_sql = 'select concat("alter table ",table_schema,".",table_name,' \

'" change ",column_name," ",column_name, " ",column_type ," comment "," ",\"\")' \

' from information_schema.columns ' \

' where table_name=\"\"'.format(

comment = '%s',

table = tablename

)comment_sql = 'select column_name,column_comment from information_schema.columns where table_name = \'%s\'' % (origin_table)

cursor.execute(alter_sql)

alter = cursor.fetchall()

sqllist =

for sql in alter:

splitlist = sql[0].split(" ")

# 欄位在第四位

field = splitlist[4]

cursor.execute(comment_sql)

name_comment = cursor.fetchall()

# 開始拼接

executesql =

for sql in sqllist:

for comment in name_comment:

if comment[0] == sql[1]:

execute = sql[0] % ('"' + comment[1] + '"')

executesql = ";".join(executesql)

try:

cursor.execute(executesql)

except exception as e:

mysqldb.rollback()

print(str(e))

cursor.close()

mysqldb.commit()

if __name__ == "__main__":

conn = connection()

mysqldb, mysqlengine = conn.mysqlconnect('ip', 'username', 'password', 'db')

update_comment(mysqldb, "origin_table", "new_table")

最後執行成功,資料庫表中注釋就有了

MySql根據關聯字段 同步某些字段資料

一 問題說明 今天弄資料庫的時候需要通過關聯字段同步一張表的字段內容到另一張表的字段內容。ps 把一張表中的某個字段內容同步到另一張表的字段,前提條件是兩張表要有關聯字段。二 解決方法 mysql通過關聯欄位key,同步表table name1的content欄位內容 到 table name2的c...

MySQL 字段資料型別說明

型別說明 儲存量tinyint m unsigned zerofill 乙個很小的整數。有符號的範圍是 128到127,無符號的範圍是0到255。1 位元組 smallint m unsigned zerofill 乙個小整數。有符號的範圍是 32768到32767,無符號的範圍是0到65535。2...

909422229 mysql 字段資料拼接

一 工作中難免會遇到資料庫資料字段拼接的事情,舉例如下。例如 原來乙個表中有id,name兩個字段,現在業務變成,name後面都需要加上 admin這個字尾,表名是特殊帳號切無視主鍵id,只修改name的情況下。那麼使用的sql是 insert into t user select uuid nam...