NHibernate代码生成器,,使用pyodbc连接MS


使用pyodbc连接MSSQL。

使用时,注意要修改代码开始部分的数据库连接和要生成的表名称。

#导入pyodbcimport pyodbc   con = 'DRIVER={SQL Server};SERVER=jw01;DATABASE=pm2_dev;UID=sa;PWD=sa'  #连接字符串cnxn = pyodbc.connect(con)cursor = cnxn.cursor()table_name = 'Basic_Privilege'                                         #表名namespace = 'cn.justwin.Domain.Entities'                                #命名空间名称assembly_name = 'Domain'                                                #程序集名称class_name = table_name.replace('_', '')                                #类名filecs = open(class_name + '.cs', 'w')                                  #cs文件filexml = open(class_name + '.hbm.xml', 'w')                            #xml文件#MSSQL和C#的数据类型字典typedict = {'int': 'int', 'float': 'float', 'decimal': 'decimal', 'char': 'string', 'varchar': 'string',     'nvarchar': 'string', 'uniqueidentifier': 'Guid', 'datetime': 'DateTime', 'bit': 'bool'}#查找主键cursor.execute('''    SELECT COLUMN_NAME FROM information_schema.constraint_column_usage    WHERE table_name = ? AND CONSTRAINT_NAME LIKE 'PK%'''', table_name)key_name = cursor.fetchone().COLUMN_NAME#写入CS文件的命名空间和类名filecs.write('using System;\\n\\n')filecs.write('namespace %s\\n' % (namespace))     filecs.write('{\\n')   filecs.write('\\t/// <summary>\\n')filecs.write('\\t/// %s\\n' % (class_name))filecs.write('\\t/// </summary>\\n')filecs.write('\\tpublic class %s\\n' % (class_name))filecs.write('\\t{\\n')#写入XML文件filexml.write('<?xml version="1.0" encoding="utf-8"?>\\n')filexml.write('<hibernate-mapping assembly="%s" namespace="%s" xmlns="urn:nhibernate-mapping-2.2">\\n'        % (assembly_name, namespace))filexml.write('\\t<class name="%s" table="%s" lazy="true" >\\n' % (class_name, table_name))#写入字段cursor.execute('''    SELECT SC.COLUMN_NAME, SC.COLUMN_DEFAULT, SC.IS_NULLABLE, SC.DATA_TYPE,        SC.CHARACTER_MAXIMUM_LENGTH AS LENGTH, CAST(P.value AS nvarchar(200)) AS MS_DESC    FROM information_schema.columns AS SC    JOIN sys.tables AS T ON SC.TABLE_NAME = T.name    JOIN sys.columns AS C ON T.object_id = C.object_id AND C.name = SC.COLUMN_NAME    LEFT JOIN sys.extended_properties AS P ON C.column_id = p.minor_id AND P.major_id = T.object_id    WHERE SC.table_name = ?''', table_name)rows = cursor.fetchall()for r in rows:    #计算数据类型    data_type = typedict[r.DATA_TYPE]    if r.IS_NULLABLE == 'YES' and data_type != 'string':         data_type += '?'    #字段描述,需要编码    ms_desc = r.MS_DESC.encode('utf-8') if r.MS_DESC else r.COLUMN_NAME    filecs.write('\\t\\t/// <summary>\\n')    filecs.write('\\t\\t/// %s\\n' % (ms_desc))    filecs.write('\\t\\t/// </summary>\\n')    filecs.write('\\t\\tpublic virtual %s %s { get; set; }\\n\\n' % (data_type, r.COLUMN_NAME))    #XML中写入属性    property_type = 'id' if r.COLUMN_NAME == key_name else 'property'    filexml.write('\\t\\t<%s name="%s">\\n' % (property_type, r.COLUMN_NAME))    column_info = '\\t\\t\\t<column name="%s" sql-type="%s' % (r.COLUMN_NAME, r.DATA_TYPE)    if (r.LENGTH):        column_info += '(max)' if r.LENGTH == -1 else '" length="%s' %(str(r.LENGTH))    column_info += '" not-null="false" />\\n' if r.IS_NULLABLE == 'YES' else '" not-null="true" />\\n'    filexml.write(column_info)    filexml.write('\\t\\t</%s>\\n' % (property_type))  #重载Object的方法filecs.write('\\t\\t#region Override Object Method\\n')filecs.write('\\t\\tpublic override string ToString()\\n')filecs.write('\\t\\t{\\n')filecs.write('\\t\\t\\treturn this.%s.ToString();\\n' % (key_name))filecs.write('\\t\\t}\\n')filecs.write('\\t\\tpublic override int GetHashCode()\\n')filecs.write('\\t\\t{\\n')filecs.write('\\t\\t\\treturn this.%s.GetHashCode();\\n' % (key_name))filecs.write('\\t\\t}\\n')filecs.write('\\t\\tpublic override bool Equals(object obj)\\n')filecs.write('\\t\\t{\\n')filecs.write('\\t\\t\\tif (obj == null) return false;\\n')filecs.write('\\t\\t\\tif (object.ReferenceEquals(this, obj)) return true;\\n')filecs.write('\\t\\t\\tif (this.GetType() != obj.GetType()) return false;\\n')filecs.write('\\t\\t\\treturn this.%s == ((%s)obj).%s;\\n' % (key_name, class_name, key_name))filecs.write('\\t\\t}\\n')#结束重载Object的方法filecs.write('\\t\\t#endregion\\n')#结束CS文件filecs.write('\\t}\\n')       #类结束符filecs.write('}\\n')         #命名空间结束符filecs.close()#结束XML文件filexml.write('\\t</class>\\n')filexml.write('</hibernate-mapping>')filexml.close()#该片段来自于http://byrx.net

评论关闭