[需要测试]我重写了wwwsqldesigner的sqlalchemy部分

黑传说 发布于 2010/05/26 15:17
阅读 788
收藏 2

因为最近大量使用sqlalchemy来搞我bt复杂的数据库,发现wwwsqldesigner不错,美中不足的是对sqlalchemy表现不是很好,所以自己重新写了一遍,主要是重写了数据类型和输出代码(使用了声明的方法来替换掉传统方法,节省大量代码并让结构更清晰)。

目前还有一个问题没搞:列联表的实现(好像wwwsqldesigner这方面还不咋样,等我那天有空再来修正吧,反正我主要是用来图形化看看数据库表之间的关系的,关系如果自己写也很快的)

两个文件都放入db/sqlalchemy文件夹中,替换掉原来的。

这个是datatype.xml的(呵呵,暂时我自己用,所以给数据类型添加了中文名字,如果要提交到官方的话,会去掉。)

<?xml version="1.0"?>
<datatypes db="sqlalchemy">
	<group label="数Numeric" color="rgb(238,238,170)">		
		<type label="短整数SmallInteger" length="1" sql="SmallInteger" re="DOUBLE" quote=""/>
		<type label="整数Integer" length="1" sql="Integer" re="INTEGER" quote=""/>
		<type label="小数Numeric" length="1" sql="Numeric" re="DOUBLE" quote=""/>
		<type label="浮点数Float" length="1" sql="Float" re="DOUBLE" quote=""/>			
	</group>

	<group label="字符Character" color="rgb(255,200,200)">
        <type label="定长文本String" length="1" sql="String" quote="'"/>
        <type label="不定长文本Text" length="0" sql="Text" quote="'"/>	
        <type label="定长文本(万国码)Unicode" length="1" sql="Unicode" quote="'"/>
        <type label="不定长文本(万国码)UnicodeText" length="0" sql="UnicodeText" quote="'"/>
        <type label="非此及彼型Boolean" length="0" sql="Boolean" quote=""/>
        <type label="二进制Binary" length="1" sql="Binary" quote="'"/>
        <type label="大二进制LargeBinary" length="1" sql="LargeBinary" quote="'"/>
    </group>

    <group label="日期 &amp; 时间" color="rgb(200,255,200)">
        <type label="日期Date" length="0" sql="Date" quote="'"/>
        <type label="时间Time" length="0" sql="Time" quote="'"/>
        <type label="日期时间DateTime" length="0" sql="DateTime" quote="'"/>
        <type label="Interval" length="0" sql="Interval" quote="'"/>
    </group>
    
    <group label="混合型Miscellaneous" color="rgb(200,200,255)">
        <type label="结构化数据PickleType" length="0" sql="PickleType" quote=""/>
        <type label="枚举Enum" length="0" sql="Enum" quote=""/>
        <type label="SchemaType" length="0" sql="SchemaTyp" quote=""/>
    </group>
</datatypes>
这个是output.xsl的

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<!-- At present, it is in alpha -->

<!-- the root of output -->
	<xsl:template match="/sql">
		<!--the Header -->
		<!--Import -->
		<xsl:text># -*- coding: utf-8 -*-&#xa;</xsl:text>
		<xsl:text>from sqlalchemy import Table, Column, ForeignKey, MetaData&#xa;</xsl:text>
		<xsl:text>from sqlalchemy.orm import mapper, relationship, backref, synonym&#xa;</xsl:text>
		<xsl:text>from sqlalchemy.types import Integer, Unicode, UnicodeText, Boolean, Binary, DateTime, PicleType&#xa;</xsl:text>
		<xsl:text>from sqlalchemy.ext.declarative import declarative_base&#xa;</xsl:text>
	
		<xsl:text>from sqlalchemy import create_engine&#xa;</xsl:text>
		<xsl:text>engine = create_engine('sqlite:///:memory:', echo=True)&#xa;&#xa;</xsl:text>
		<xsl:text>DeclarativeBase = declarative_base()&#xa;</xsl:text>

	      <!-- All Tables Name List Here -->
		<xsl:text>&#xa;&#xa;# All Table Name List Here</xsl:text>
		<xsl:text>&#xa;</xsl:text>
		<xsl:text>__all__ = [</xsl:text>
			<xsl:text>'</xsl:text>
			<xsl:text>' </xsl:text>
		<xsl:text>]&#xa;</xsl:text>

		<!-- Association Tables -->
		<xsl:text>&#xa;# Association tables - </xsl:text>
		<xsl:text>&#xa;</xsl:text>

		<!-- Table Class Declaractive -->
		<xsl:text>&#xa;&#xa;# Table Declaractive</xsl:text>
		<xsl:apply-templates select="table" />
		<xsl:text>&#xa;</xsl:text>
	</xsl:template>

	<!-- table class declaractive template -->
	<xsl:template match="table">		
		<xsl:if test="comment">
			<xsl:text>&#xa;# </xsl:text>
			<xsl:value-of select="./comment"/>
		</xsl:if>
		<xsl:text>&#xa;</xsl:text>
		<xsl:text>class </xsl:text>
		<xsl:value-of select="@name"/>
		<xsl:text>(DeclarativeBase):&#xa;</xsl:text>
		
		<xsl:text>    __tablename__ = '</xsl:text>
		<xsl:value-of select="@name"/>
		<xsl:text>'&#xa;&#xa;</xsl:text>
		
		<xsl:apply-templates select="row"/>
		
		<xsl:text>&#xa;&#xa;</xsl:text>            
		<xsl:text>    def __init__(self</xsl:text>
		<xsl:for-each select="row">
			<xsl:text>, </xsl:text>
			<xsl:value-of select="@name"/>
		</xsl:for-each>
		<xsl:text>):&#xa;</xsl:text>
		<xsl:for-each select="row">
			<xsl:text>        self.</xsl:text>
			<xsl:value-of select="@name"/>
			<xsl:text> = </xsl:text>
			<xsl:value-of select="@name"/>
			<xsl:text>&#xa;</xsl:text>
		</xsl:for-each>
		<xsl:text>&#xa;</xsl:text>
            
		<xsl:text>    def __repr__(self):&#xa;</xsl:text>
		<xsl:text>        return "&lt;</xsl:text>
		<xsl:value-of select="@name"/>
		<xsl:text>(</xsl:text>
		<xsl:for-each select="row">
			<xsl:text>'%s'</xsl:text>
			<xsl:if test="not (position()=last())">
				<xsl:text>, </xsl:text>
			</xsl:if>
		</xsl:for-each>
		<xsl:text>)>" % (</xsl:text>
		<xsl:for-each select="row">
			<xsl:text>self.</xsl:text>
			<xsl:value-of select="@name"/>
			<xsl:if test="not (position()=last())">
				<xsl:text>, </xsl:text>
			</xsl:if>
		</xsl:for-each>
		<xsl:text>)&#xa;&#xa;</xsl:text>
       
		<xsl:text>    def __unicode__(self):&#xa;</xsl:text>
		<xsl:text>        return </xsl:text>           
		<xsl:for-each select="row">
			<xsl:text>self.</xsl:text>
			<xsl:value-of select="@name"/>
			<xsl:if test="not (position()=last())">
				<xsl:text>, </xsl:text>
			</xsl:if>
		</xsl:for-each>
		<xsl:text>&#xa;</xsl:text>
	</xsl:template>

<!-- the row template -->
	<xsl:template match="row">
		<xsl:if test="comment">
			<xsl:text>    # </xsl:text>
			<xsl:value-of select="./comment"/>
			<xsl:text>&#xa;</xsl:text>
		</xsl:if>		
		<xsl:text>    </xsl:text>
		<xsl:value-of select="@name"/>
		<xsl:text> = </xsl:text>
		<xsl:text>Column(</xsl:text>
		<xsl:value-of select="datatype" />
		<!-- if it have relation to other table -->
		<xsl:for-each select="relation">
			<xsl:text>, ForeignKey("</xsl:text>
			<xsl:value-of select="@table" />
			<xsl:text>.</xsl:text>
			<xsl:value-of select="@row" />
			<xsl:text>")</xsl:text>
		</xsl:for-each>
        <!-- Add params for node params -->
		<xsl:if test="@null='1'">
			<xsl:text>, nullable=True</xsl:text>
		</xsl:if>
		<xsl:if test="@autoincrement='0'">
		 	<xsl:text>, autoincrement=False</xsl:text>
		</xsl:if>
        <!-- Add other params -->
		<xsl:for-each select="key">
			<xsl:choose>
			<xsl:when test="@type = 'PRIMARY'">primary_key=True</xsl:when>
			<xsl:when test="@type = 'UNIQUE'">unique=True</xsl:when>
			<xsl:when test="@type = 'INDEX'">index=True</xsl:when>	    
			</xsl:choose>
			<xsl:for-each select="part">
				<xsl:text>`</xsl:text>
				<xsl:value-of select="." />
				<xsl:text>`</xsl:text>
				<xsl:if test="not (position() = last())">
					<xsl:text>, </xsl:text>
				</xsl:if>
			</xsl:for-each>
		 </xsl:for-each>

        <!-- Finish the row -->
		<xsl:text>)&#xa;</xsl:text>
	</xsl:template>

</xsl:stylesheet>

 

加载中
0
g
gzdakai

你好,你会修改安装包的数据吗

可有不可以帮我修改点数据,,,拜托了

0
g
gzdakai

拜托帮帮忙了。。。高手

,我QQ是237978980

0
黑传说
黑传说

引用来自#2楼“gzdakai”的帖子

你好,你会修改安装包的数据吗

可有不可以帮我修改点数据,,,拜托了

啥安装包数据?

这个不用安装的啊,直接浏览器打开就可以了,当然,安装也可以。

0
gatspy
gatspy

解压就能只能用吗 不用部署到web服务器吗?

返回顶部
顶部