GVKun编程网logo

mssql 唯一索引和约束 讲述(mysql唯一索引和唯一约束的区别)

1

以上就是给各位分享mssql唯一索引和约束讲述,其中也会对mysql唯一索引和唯一约束的区别进行解释,同时本文还将给你拓展asp.net-mvc-3–使用存储过程(MSSQL)时Dapper的缓存解决

以上就是给各位分享mssql 唯一索引和约束 讲述,其中也会对mysql唯一索引和唯一约束的区别进行解释,同时本文还将给你拓展asp.net-mvc-3 – 使用存储过程(MSSQL)时Dapper的缓存解决方案、BI学习走过的路---MSSQL 2008 安装过程、C# 数据类型映射 (SQLite,MySQL,MSSQL,Oracle)、Connect to MSSQL Database using Flask-SQLAlchemy等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

mssql 唯一索引和约束 讲述(mysql唯一索引和唯一约束的区别)

mssql 唯一索引和约束 讲述(mysql唯一索引和唯一约束的区别)

唯一索引和其它索引本质上并没有什么不同,唯一不同的是唯一索引不允许索引键中存在相同的值。因为索引中每一个条目都与表中的行对应。

唯一索引和约束
    唯一索引不允许重复值被插入索引也就保证了对应的行不允许被插入索引所在的表,这也是为什么唯一索引能够实现主键和候选键。

    为表声明主键或唯一约束时,sql server会自动创建与之对应的唯一索引。你可以在没有唯一约束的情况下创建唯一索引,但反之则不行。定义一个约束时,sql server会自动创建一个与之同名的索引,并且你不能在删除约束之前删除索引。但可以删除约束,删除约束也会导致与之关联的索引被删除。

    每个表中可以包含多个唯一索引。比如说AdventureWorks的Product表,含有四个唯一索引,分别是ProductID,ProductNumber,rowguid和ProductNameColumn,设置Product表的人将ProductID作为主键,其它三个作为候选键。

     你可以通过Create INDEX语句创建唯一索引,比如:

 代码如下 复制代码

CREATE UNIQUE NONCLUSTERED INDEX [AK_Product_Name] ON Production.Product (
[Name] );

      也可以通过直接定义约束创建唯一索引:

 代码如下 复制代码

ALTER TABLE Production.Product ADD CONSTRAINT PK_Product_ProductID PRIMARY KEY
CLUSTERED ( ProductID );

 

    上面第一种方法,你Prodcut表中不能含有相同的ProductName,第二种情况表中不允许存在相同的ProductID。

    因为定义一个主键或是定义约束会导致索引被创建,所以你必须在约束定义时就给出必要的索引信息,因此上面ALTER TABLE语句中包含了”CLUSTERED”关键字。

    如果唯一索引或约束所约束的列在当前的表中已经含有了重复值,那么创建索引会失败。

    而当唯一索引创建成功后,所有违反这个约束的DML语句都会失败,比如,我们打算加入一条当前表中存在的的ProductName,语句如下:

 代码如下 复制代码

INSERT    Production.Product
                    ( Name ,
                      ProductNumber ,
                      Color ,
                      SafetyStockLevel ,
                      ReorderPoint ,
                      StandardCost ,
                      ListPrice ,
                      Size ,
                      SizeUnitMeasureCode ,
                      WeightUnitMeasureCode ,
                      [Weight] ,
                      DaysToManufacture ,
                      ProductLine ,
                      Class ,
                      Style ,
                      ProductSubcategoryID ,
                      ProductModelID ,
                      SellStartDate ,
                      SellEndDate ,
                      DiscontinuedDate
                    )           VALUES    ( ''Full-Finger Gloves, M'' ,
                      ''A unique product number'' ,
                      ''Black'' ,
                      4 ,
                      3 ,
                      20.00 ,
                      40.00 ,
                      ''M'' ,
                      NULL ,
                      NULL ,
                      NULL ,
                      0 ,
                      ''M'' ,
                      NULL ,
                      ''U'' ,
                      20 ,
                      3 ,
                      GETDATE() ,
                      GETDATE() ,
                      NULL
                    ) ;

 

代码1.插入的行和表中存在相同的ProductName

 上面代码执行后我们可以看到如下报错信息:

消息 2601,级别 14,状态 1,第 1 行 不能在具有唯一索引 ''AK_Product_Name'' 的对象
''Production.Product'' 中插入重复键的行。 语句已终止。

 

上面的消息告诉我们AK_Product_Name索引不允许我们插入的数据含有和当前表中一样的ProductName。

 主键,唯一约束和没有约束
    主键约束和唯一约束有如下细小的差别。


•    主键约束不允许出现NULL值。任何索引的索引键都不允许包含null值。但唯一约束允许包含NULL值,但唯一约束把两个NULL值当作重复值,所以施加了唯一约束的每一列只允许包含一个NULL值。
•    创建主键时会自动创建聚集索引,除非当前表中已经含有了聚集索引或是创建主键时指定了NONCLUSTERED关键字。
•    创建唯一约束时会自动创建非聚集索引,除非你指定了CLUSTERED关键字并且当前表中还没有聚集索引。
•    每个表中只能有一个主键,但可以由多个唯一约束。
 

    对于唯一约束和唯一索引的选择,请参照MSDN上的指导,如下:

    唯一约束和唯一索引并没有显著的区别。创建独立的唯一索引和使用唯一约束对于数据的验证方式并无区别。查询优化器也不会区分唯一索引是由约束创建还是手工创建。然而以数据完整性为目标的话,最好创建约束,这使得对应的索引的目标一目了然。

 混合唯一索引和过滤索引
     上面我们提到过唯一索引只允许一个NULL值,但这和常见的业务需求有冲突。很多时候我们对于已经存在的值不允许重复,但是允许存在多个没有值的列。

    比如说吧,你是一个供货商,你所有的产品都来自于第三方厂商。你将你这里所有的商品信息都存在一个叫做ProductDemo的表中。你有自己的ProductID,还追踪产品的UPC(Universal Product Code)值。但并不是所有的厂商产品都存在UPC,你表中的部分数据如下所示。

ProductID UPCode Other Columns
主键 唯一索引  
     
14AJ-W 036000291452
  
23CZ-M    
23CZ-L    
18MM-J 044000865867
  

表1.ProductDemo表的部分内容

在上表中第二列,你既要保证UPCode的唯一性,又要保证允许NULL值。实现这种需求最好的办法就是混合唯一索引和过滤索引(过滤索引实在SQL Server 2008中引入的)。

    作为演示,我们创建了表1所示的表.

 代码如下 复制代码

CREATE TABLE ProductDemo
                (
                  ProductID NCHAR(6) NOT NULL
                                     PRIMARY KEY ,
                  UPCode NCHAR(12) NULL
                ) ;

 接下来我们插入如上所示的数据.

 代码如下 复制代码

INSERT  ProductDemo         (
ProductID, UPCode ) VALUES  ( ''14AJ-W'', ''036000291452'' )
,       ( ''23CZ-M'', NULL )
,       ( ''23CZ-L'', NULL )
,       ( ''18MM-J'', ''044000865867'' ) ;

 当我们插入重复值时

 代码如下 复制代码

 INSERT ProductDemo (ProductID , UPCode) VALUES (''14AJ-K'', ''036000291452'');

    收到如下错误

消息 2601,级别 14,状态 1,第 1 行 不能在具有唯一索引 ''xx'' 的对象 ''dbo.ProductDemo'' 中插入重复键的行。
语句已终止。


   (译者注,这里原文作者应该是疏忽了,略坑爹,因为他没有创建过滤唯一索引,所以按照原文不会报错,我在这里加上了,代码:CREATE UNIQUE NONCLUSTERED INDEX xx on ProductDemo(UPCode) where UPCode!=null)

 选择合适的IGNORE_DUP_KEY选项
 

    当你创建唯一索引时,你可以指定IGNORE_DUP_KEY选项,因此本文最开始创建唯一索引的选项可以是:

 代码如下 复制代码

CREATE UNIQUE NONCLUSTERED INDEX AK_Product_Name ON Production.Product ( [Name]
) WITH ( IGNORE_DUP_KEY = OFF );

      IGNORE_DUP_KEY这个名字容易让人误会。唯一索引存在时重复的值永远不会被忽略。更准确的说,唯一索引中永远不允许存在重复键。这个选项的作用仅仅是在多列插入时有用。

    比如,你有两个表,表A和表B,有着完全相同的结构。你可能提交如下语句给SQL Server。

 代码如下 复制代码

INSERT INTO TableA SELECT * FROM TableB;

     SQL Server会尝试将所有表B中的数据插入表A。但如果因为唯一索引拒绝表B中含有和表A相同的数据插入A怎么办?你是希望仅仅重复数据插入不成功,还是整个INSERT语句不成功?

    这个取决于你设定的IGNORE_DUP_KEY参数,当你创建唯一索引时,通过设置设个参数可以设定当插入不成功时怎么办,设置IGNORE_DUP_KEY的两种参数解释如下:

    IGNORE_DUP_KEY=OFF

    整个INSERT语句都不会成功并弹出错误提示,这也是默认设置。

 

IGNORE_DUP_KEY=OFF

    只有那些具有重复键的行不成功,其它所有的行会成功。并弹出警告信息。

     IGNORE_DUP_KEY 选项仅仅影响插入语句。而不会被UPDATE,CREATE INDEX,ALTER INDEX所影响。这个选项也可以在设置主键和唯一约束时进行设置。

   为什么唯一索引可以提供额外的性能提升
    唯一索引可以提供出乎你意料之外的性能提升。这是因为唯一索引给SQL Server提供了确保某一列绝对没有重复值的信息。adventureWork的Product表中的ProductID和ProductName这两个唯一索引,提供了很好的例子。

    加入,你们公司数据仓库的某个哥们希望你给他提供Product表的一些信息,要求如下:

•    产品名称
•    产品销售的数量
•    总销售额
    因此,你写了如下的查询语句:

 代码如下 复制代码

SELECT  [Name] ,         COUNT(*) AS
''RowCount'' ,         SUM(LineTotal) AS
''TotalValue'' FROM    Production.Product P
        JOIN Sales.SalesOrderDetail D ON
D.ProductID = P.ProductID GROUP BY P.Name

 

    (译者注,这里原作者给的代码有问题,ProductID替换为P.Name)

   数据仓库的哥们对你的查询语句很满意,每一行都包含了产品名称,销售数量和总的销售额,查询出来的部分结果如下:

       但是,你对于这个查询的成本有所担心。SalesOrderDetail是上面查询中两个表中比较大的表,并且还按照ProductName进行分组,这个ProductName是来自Product表而不是SalesOrderDetail表。

    通过SQL Server Management Studio,你注意到SalesOrderDetail表有主键,并且主键也是聚集索引键,也就是SalesOrderID和SalesOrderDetailID,这个主键并不会给按照ProductName分组带来性能提升。

    如果你运行了第五篇包含列的代码,你创建了如下非聚集索引。

 代码如下 复制代码

CREATE NONCLUSTERED INDEX FK_ProductID_ModifiedDate ON
Sales.SalesOrderDetail ( ProductID, ModifiedDate ) INCLUDE
( OrderQty, UnitPrice, LineTotal ) ;

    你觉得这个索引可以对你的查询有帮助因为这个索引包含了除了ProductName列的所有查询所需的信息。并且这个索引是按照ProductID进行排序的,但你仍然担心分组的ProductID来自其中一个表而Select的信息来自另一个表。

    你通过SQL Server Management Studio,通过查看执行计划,看到前面数据仓库那哥们要的查询的执行计划如图1所示。

.按Product.Name进行分组时的执行计划

     首先你可以惊讶于Product表的Product name索引,Product.AK_Product_Name没有被使用.然后你意识到在Product.Name列上和Product.ProductID上有唯一索引,这使得SQL Server知道这两列是唯一的。因此,Group By Name等效于Group By ProductID。这使得一个产品一个组。

    因此,查询优化器意识到你的查询等同于如下查询,这两个ProductID索引因此支持对所求查询的Join和group操作。

 代码如下 复制代码

SELECT  [Name] ,         COUNT(*) AS
''RowCount'' ,         SUM(LineTotal) AS
''TotalValue'' FROM    Production.Product P
        JOIN Sales.SalesOrderDetail D ON
D.ProductID = P.ProductID GROUP BY ProductID

    SQL Server会同时扫描SalesOrderDetail上的覆盖索引和聚集索引,这两个索引都是以ProductID进行排序的。因此使用合并连接,而免去了排序或散列操作,总之SQL Server生成了最有效的查询计划。

    如果你Drop了Product.AK_Product_Name索引,比如:

 代码如下 复制代码

IF EXISTS ( SELECT * FROM sys.indexes WHERE OBJECT_ID =
OBJECT_ID(N''Production.Product'') AND name = N''AK_Product_Name'') DROP
INDEX AK_Product_Name ON Production.Product;

那么生成的新的执行计划就没有那么有效了,需要额外的排序和合并连接操作。

图2.当Drop掉索引后,按照Product Name进行分组的查询的执行计划

你可以看到,虽然唯一索引的主要功能是保证数据的完整性,还可以帮助查询优化器生成更好的查询计划,即使这个索引本身不被用来访问数据。

总结
    唯一索引为主键和候选键提供了约束。唯一索引可以在没有唯一约束时存在,反之则不行。

     唯一索引同时也可以是过滤索引,这使得唯一索引可以允许一列中有多个NULL值。

    IGNORE_DUP_KEY 关键字可以影响批量插入语句。

    唯一索引还可以提供更好的性能,既然唯一索引本身并没有用于数据访问

asp.net-mvc-3 – 使用存储过程(MSSQL)时Dapper的缓存解决方案

asp.net-mvc-3 – 使用存储过程(MSSQL)时Dapper的缓存解决方案

我正在使用Dapper主要用于调用数据库MSsql 2008 R2中的存储过程.我没有映射到数据库表的类.大多数数据以IEnumerable< Dynamic>结尾.并传输到屏幕上的网格.

我可以使用现成的数据缓冲解决方案吗? (我需要在MVC上使用它).

数据库中的数据本质上是静态的和动态的.我使用存储库模型来访问数据.

解决方法

Dapper不包含任何内置数据缓存功能(虽然它在内部为元编程层使用了广泛的缓存):它本身就是针对ADO.NET的东西 – 但是,你几乎可以使用任何现成的缓存组件,包括HTTP运行时缓存(HttpContext.Current.Cache)或更新的ObjectCache等实现.因为这些只是对象,它应该工作正常.

如果您使用分布式缓存(可能通过app-fabric,redis或memcached),那么您需要将数据序列化.在那种情况下,我强烈建议使用正式的POCO类型进行绑定,而不是动态API.例如,我们在内部使用dapper来填充用protobuf-net标记进行注释以进行序列化的POCO,并通过BookSleeve存储到redis.这听起来比实际更复杂.

BI学习走过的路---MSSQL 2008 安装过程

BI学习走过的路---MSSQL 2008 安装过程

学习BI,开始的路程十分坎坷啊。

我学习的是针对MS sql Server的BI开发

刚熟悉了各种术语之后,开始安装数据库、sql服务、SSAS、SSIS

结果悲催的是,从官网下载了Express版本的2008数据库,怎么找都找不到SSAS、SSIS等服务。

为此足足失眠了3天左右的时间……

不过,功夫不负有心人,终于找到了一个可以十分简单的下载微软软件的网站,再次分享给各位朋友。

http://msdn.itellyou.cn/

同时,在此处分享一个sql Server 2008的安装图解

http://www.cnblogs.com/downmoon/archive/2010/05/18/1738479.html

国内关于BI的学习,在网络上资料比较有限,而且杂乱,本人在学习过程中会将一些学习心得在此与大家分享下,希望能给大家带来帮助。

C# 数据类型映射 (SQLite,MySQL,MSSQL,Oracle)

C# 数据类型映射 (SQLite,MySQL,MSSQL,Oracle)

 MSSQL

SQLITE

一、C# vs SQLite:

C# SQLite 字段名 类型 库类型 GetFieldType(#) 转换 备注 F_BOOL bool BIT NOT NULL Boolean     F_BOOL_NULL bool? BIT Boolean     F_SBYTE sbyte INT8 NOT NULL SByte sbyte_   F_SBYTE_NULL sbyte? INT8 SByte sbyte_   F_BYTE byte UINT8 NOT NULL Byte     F_BYTE_NULL byte? UINT8 Byte     F_SHORT short INT16 NOT NULL Int16     F_SHORT_NULL short? INT16 Int16     F_USHORT ushort UINT16 NOT NULL UInt16 ushort_   F_USHORT_NULL ushort? UINT16 UInt16 ushort_   F_INT int INT32 NOT NULL Int32     F_INT_NULL int? INT32 Int32     F_UINT uint UINT32 NOT NULL UInt32 uint_   F_UINT_NULL uint? UINT32 UInt32 uint_   F_LONG long INT64 NOT NULL Int64     F_LONG_NULL long? INT64 Int64     F_ULONG ulong UINT64 NOT NULL UInt64 ulong_   F_ULONG_NULL ulong? UINT64 UInt64 ulong_   F_FLOAT float FLOAT NOT NULL Double   不转兼容 F_FLOAT_NULL float? FLOAT Double   不转兼容 F_DOUBLE double DOUBLE NOT NULL Double     F_DOUBLE_NULL double? DOUBLE Double     F_DECIMAL decimal DECIMAL NOT NULL Decimal   存取不一:<F_DECIMAL>: [-79228162514264300000000000000] != [-79228162514264337593543950335] F_DECIMAL_NULL decimal? DECIMAL Decimal   存取不一:<F_DECIMAL>: [-79228162514264300000000000000] != [-79228162514264337593543950335] F_CHAR char TEXT NOT NULL String     F_CHAR_NULL char? TEXT String     F_STRING string TEXT NOT NULL String     F_STRING_NULL string TEXT String     F_DATETIME DateTime TEXT NOT NULL String     F_DATETIME_NULL DateTime? TEXT String                

二、 C# vs MySQL:

C# MySQL 字段名 类型 库类型 GetFieldType(#) 转换 备注 F_BOOL bool BOOL NOT NULL Boolean     F_BOOL_NULL bool? BOOL NULL Boolean     F_SBYTE sbyte TINYINT NOT NULL SByte sbyte_   F_SBYTE_NULL sbyte? TINYINT NULL SByte sbyte_   F_BYTE byte TINYINT UNSIGNED NOT NULL Byte     F_BYTE_NULL byte? TINYINT UNSIGNED NULL Byte     F_SHORT short SMALLINT NOT NULL Int16     F_SHORT_NULL short? SMALLINT NULL Int16     F_USHORT ushort SMALLINT UNSIGNED NOT NULL UInt16 ushort_   F_USHORT_NULL ushort? SMALLINT UNSIGNED NULL UInt16 ushort_   F_INT int INT NOT NULL Int32     F_INT_NULL int? INT NULL Int32     F_UINT uint INT UNSIGNED NOT NULL UInt32 uint_   F_UINT_NULL uint? INT UNSIGNED NULL UInt32 uint_   F_LONG long BIGINT NOT NULL Int64     F_LONG_NULL long? BIGINT NULL Int64     F_ULONG ulong BIGINT UNSIGNED NOT NULL UInt64 ulong_   F_ULONG_NULL ulong? BIGINT UNSIGNED NULL UInt64 ulong_   F_FLOAT float FLOAT NOT NULL Single   极值溢出 F_FLOAT_NULL float? FLOAT NULL Single   极值溢出 F_DOUBLE double DOUBLE NOT NULL Double     F_DOUBLE_NULL double? DOUBLE NULL Double     F_DECIMAL decimal DECIMAL NOT NULL Decimal   极值溢出 F_DECIMAL_NULL decimal? DECIMAL NULL Decimal   极值溢出 F_CHAR char CHARACTER NOT NULL String   中文报错 F_CHAR_NULL char? CHARACTER NULL String   中文报错 F_STRING string VARCHAR(50) NOT NULL String     F_STRING_NULL string VARCHAR(50) NULL String     F_DATETIME DateTime DATETIME NOT NULL DateTime     F_DATETIME_NULL DateTime? DATETIME NULL DateTime                

三、 C# vs MSSQL:

C# MSSQL 字段名 类型 库类型 GetFieldType(#) 转换 备注 F_BOOL bool bit NOT NULL Boolean     F_BOOL_NULL bool? bit NULL Boolean     F_SBYTE sbyte smallint NOT NULL Int16 sbyte_short   F_SBYTE_NULL sbyte? smallint NULL Int16 sbyte_short   F_BYTE byte tinyint NOT NUL; Byte     F_BYTE_NULL byte? tinyint NULL Byte     F_SHORT short smallint NOT NULL Int16     F_SHORT_NULL short? smallint NULL Int16     F_USHORT ushort int NOT NULL Int32 ushort_int   F_USHORT_NULL ushort? int NULL Int32 ushort_int   F_INT int int NOT NULL Int32     F_INT_NULL int? int NULL Int32     F_UINT uint bigint NOT NULL Int64 uint_long   F_UINT_NULL uint? bigint NULL Int64 uint_long   F_LONG long bigint NOT NULL Int64     F_LONG_NULL long? bigint NULL Int64     F_ULONG ulong real NOT NULL Single ulong_float   F_ULONG_NULL ulong? real NULL Single ulong_float   F_FLOAT float real NOT NULL Single     F_FLOAT_NULL float? real NULL Single     F_DOUBLE double float NOT NULL Double     F_DOUBLE_NULL double? float NULL Double     F_DECIMAL decimal decimal NOT NULL Decimal   极值溢出 F_DECIMAL_NULL decimal? decimal NULL Decimal   极值溢出 F_CHAR char char(1) NOT NULL String     F_CHAR_NULL char? char(1) NULL String     F_STRING string varchar(50) NOT NULL F_STRING:     F_STRING_NULL string varchar(50) NULL String     F_DATETIME DateTime datetime NOT NULL DateTime   必须介于 1/1/1753 12:00:00 AM 12/31/9999 11:59:59 PM 之间。 F_DATETIME_NULL DateTime? datetime NULL DateTime                

四、C# vs Oracle:

C# Oracle 字段名 类型 库类型 GetFieldType(#) 转换 备注 F_BOOL bool CHAR(1) NOT NULL String bool_string   F_BOOL_NULL bool? CHAR(1) String bool_string   F_SBYTE sbyte NUMBER(3) NOT NULL Int16 sbyte_short   F_SBYTE_NULL sbyte? NUMBER(3) Int16 sbyte_short   F_BYTE byte NUMBER(3) NOT NULL Int16 byte_short   F_BYTE_NULL byte? NUMBER(3) Int16 byte_short   F_SHORT short NUMBER(5) NOT NULL Int32 short_int   F_SHORT_NULL short? NUMBER(5) Int32 short_int   F_USHORT ushort NUMBER(5) NOT NULL Int32 ushort_int   F_USHORT_NULL ushort? NUMBER(5) Int32 ushort_int   F_INT int NUMBER(10) NOT NULL Int64 int_long   F_INT_NULL int? NUMBER(10) Int64 int_long   F_UINT uint NUMBER(10) NOT NULL Int64 uint_long   F_UINT_NULL uint? NUMBER(10) Int64 uint_long   F_LONG long NUMBER(19) NOT NULL Decimal long_decimal   F_LONG_NULL long? NUMBER(19) Decimal long_decimal   F_ULONG ulong NUMBER(19) NOT NULL Decimal ulong_decimal   F_ULONG_NULL ulong? NUMBER(19) Decimal ulong_decimal   F_FLOAT float BINARY_FLOAT NOT NULL Single     F_FLOAT_NULL float? BINARY_FLOAT Single     F_DOUBLE double BINARY_DOUBLE NOT NULL Double   极值溢出 F_DOUBLE_NULL double? BINARY_DOUBLE Double   极值溢出 F_DECIMAL decimal DECIMAL(33,3) NOT NULL Decimal     F_DECIMAL_NULL decimal? DECIMAL(33,3) Decimal     F_CHAR char CHAR(1) NOT NULL String     F_CHAR_NULL char? CHAR(1) String     F_STRING string VARCHAR(50) NOT NULL String   不允许空字符 F_STRING_NULL string VARCHAR(50) String   不允许空字符 F_DATETIME DateTime TIMESTAMP NOT NULL DateTime   大值读取报错 F_DATETIME_NULL DateTime? TIMESTAMP DateTime   大值读取报错            

附、类型转换:

using System;
using System.Collections.Generic;
using System.Text; namespace vJine.Core.ORM { public class TypeConverter { public class sbyte_ /*: IConverter<sbyte>*/ { public static sbyte CONV_Q(object V) { return (sbyte)V; } } public class ushort_ /*: IConverter<ushort>*/ { public static ushort CONV_Q(object V) { return (ushort)V; } } public class uint_ /*: IConverter<uint>*/ { public static uint CONV_Q(object V) { return (uint)V; } } public class ulong_ /*: IConverter<ulong>*/ { public static ulong CONV_Q(object V) { return (ulong)V; } } public class bool_string /*: IConverter<bool>*/ { public static object CONV_I(object V) { if ((bool)V == true) { return "1"; } else { return "0"; } } public static bool CONV_Q(object V) { if ((string)V == "1") { return true; } else { return false; } } } public class sbyte_short /*: IConverter<sbyte>*/ { public static object CONV_I(object V) { return Convert.ToInt16(V); } public static sbyte CONV_Q(object V) { return Convert.ToSByte(V); } } public class byte_short /*: IConverter<byte>*/ { public static object CONV_I(object V) { return Convert.ToInt16(V); } public static byte CONV_Q(object V) { return Convert.ToByte(V); } } public class short_int /*: IConverter<short>*/ { public static object CONV_I(object V) { return Convert.ToInt32(V); } public static short CONV_Q(object V) { return Convert.ToInt16(V); } } public class ushort_int /*: IConverter<ushort>*/ { public static object CONV_I(object V, string Name) { return Convert.ToInt32(V); } public static ushort CONV_Q(object V, string Name) { return Convert.ToUInt16(V); } } public class int_long /*: IConverter<int>*/ { public static object CONV_I(object V) { return Convert.ToInt64(V); } public static int CONV_Q(object V) { return Convert.ToInt32(V); } } public class uint_long /*: IConverter<uint>*/ { public static object CONV_I(object V) { return Convert.ToInt64(V); } public static uint CONV_Q(object V) { return Convert.ToUInt32(V); } } public class long_decimal /*: IConverter<long>*/ { public static object CONV_I(object V) { return decimal.Parse(V.ToString()); } public static long CONV_Q(object V) { return long.Parse(V.ToString()); } } public class ulong_float /*: IConverter<ulong>*/ { public static object CONV_I(object V) { return Convert.ToSingle(V); } public static ulong CONV_Q(object V) { return Convert.ToUInt64(V); } } public class ulong_decimal /*: IConverter<ulong>*/ { public static object CONV_I(object V) { return decimal.Parse(V.ToString()); } public static ulong CONV_Q(object V) { return ulong.Parse(V.ToString()); } } public class float_double /*: IConverter<float>*/ { public static object CONV_I(object V) { return Convert.ToDouble(V); } public static float CONV_Q(object V) { return Convert.ToSingle(V); } } public class char_string /*: IConverter<char>*/ { public static object CONV_I(object V) { if (V is Char) { return V; } else if (V is string) { string chars = (string)V; if (chars == "") { return ''\0''; } else { return chars[0]; } } else { throw new OrmException("Fail To Convert String[{0}] To Char", V); } } public static char CONV_Q(object V) { return ((string)V)[0]; } } public class DateTime_ /*: IConverter<DateTime>*/ { public static object CONV_I(object V) { return V; } public static DateTime CONV_Q(object V) { return (DateTime)V; } } } }
View Code

 

Connect to MSSQL Database using Flask-SQLAlchemy

Connect to MSSQL Database using Flask-SQLAlchemy

我正在尝试通过SQLAlchemy连接到本地MSSQL数据库。
以下是我的\uu init\uuuuy文件的代码摘录:

from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)app.config[''SQLALCHEMY_DATABASE_URI''] = ''mssql+pyodbc://HARRISONS-THINK/LendApp''db = SQLAlchemy(app)SQLALCHEMY_TRACK_MODIFICATIONS = False

下面是在我的型号.py文件:

from LendApp import dbclass Transaction(db.model):    transactionID = db.Column(db.Integer, primary_key=True)    amount = db.Column(db.Integer)    sender = db.Column(db.String(80))    receiver = db.Column(db.String(80))    def __repr__(self):        return ''Transaction ID: {}''.format(self.transactionID)

然后我使用Pycharm中的Python控制台连接到数据库
这两条线的执行:

>>> from LendApp import db>>> db.create_all()

This is resulting in the following error:

DBAPIError: (pyodbc.Error) (''IM002'', ''[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)'')

我唯一能想到的就是我的数据库连接字符串不正确。我试着把它改成更标准的Pyodbc连接
字符串和includingdriver={sqlserver}但不占上风。如果有人能帮我解决这个问题,我将不胜感激。
谢谢

答案1

小编典典

所以我遇到了一个非常类似的问题,通过做
跟随。
遵循[SQL炼金术]
[文件](http://docs.sqlalchemy.org/en/latest/dialogs/mssql.html#模块-
sqlalchemy.dialones.mssql语言.pyodbc)我发现我可以使用我的pyodbc连接
字符串如下:

# Python 2.ximport urllibparams = urllib.quote_plus("DRIVER={SQL Server Native Client 10.0};SERVER=dagger;DATABASE=test;UID=user;PWD=password")engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)# Python 3.ximport urllibparams = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 10.0};SERVER=dagger;DATABASE=test;UID=user;PWD=password")engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)# using the above logic I just did the followingparams = urllib.parse.quote_plus(''DRIVER={SQL Server};SERVER=HARRISONS-THINK;DATABASE=LendApp;Trusted_Connection=yes;'')app.config[''SQLALCHEMY_DATABASE_URI''] = "mssql+pyodbc:///?odbc_connect=%s" % params

This then caused an additional error because I was also using Flask-Migrate
and apparently it doesn’t like % in the connection URI. So I did some more
digging and found this post.
I then changed the following line in my ./migrations/env.py file

From:

from flask import current_appconfig.set_main_option(''sqlalchemy.url'',                   current_app.config.get(''SQLALCHEMY_DATABASE_URI''))

To:

from flask import current_appdb_url_escaped = current_app.config.get(''SQLALCHEMY_DATABASE_URI'').replace(''%'', ''%%'')config.set_main_option(''sqlalchemy.url'', db_url_escaped)

在做了所有这些之后,我能够进行迁移,一切看起来都像
它现在工作正常。

关于mssql 唯一索引和约束 讲述mysql唯一索引和唯一约束的区别的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于asp.net-mvc-3 – 使用存储过程(MSSQL)时Dapper的缓存解决方案、BI学习走过的路---MSSQL 2008 安装过程、C# 数据类型映射 (SQLite,MySQL,MSSQL,Oracle)、Connect to MSSQL Database using Flask-SQLAlchemy的相关知识,请在本站寻找。

本文标签: