C 를 위 한 간단 한 MySQL ORM
프로젝트 에서 데 이 터 를 데이터베이스 에 저장 해 야 하 는데 먼저 떠 오 르 는 것 은 각종 raw SQL 을 만 드 는 해결 방법 이다.그러나 프로젝트 가 진행 되면 서 원활 하지 못 한 것 으로 나 타 났 다.예 를 들 어 새로운 수요 가 있 기 때문에 데이터베이스 student 표 에 dept 를 추가 할 수 있 습 니 다.no 필드, 그럼 각종 raw SQ 에서 수정 이 필요 합 니 다. 공사 가 아주 큽 니 다.데이터베이스 시트 의 데 이 터 를 조작 (삽입 \ 수정 \ 삭제) 하면 조작 데이터 대상 과 마찬가지 로 많은 조작 을 간소화 하여 데이터 층 의 변경 에 편리 하고 논리 층 코드 를 수정 하지 않 아 도 됩 니 다.
// INSERT 。
int gtd_genInsertSql(struct task_t &toinsert,char *sql, int nUserID)
{
int curr = 0;
//task_id | user_id | strtext
curr += sprintf(sql,"insert into task values(%d,%d,'%s',",
toinsert.id,nUserID/*user_id*/,toinsert.strtext);
//ctime
char buffer[32];
::memset(buffer,0,sizeof(buffer));
strftime(buffer,32,"'2012-%m-%d %H-%M-%S',",&(toinsert.ctime));
strncpy(sql+curr,buffer,strlen(buffer));
curr += strlen(buffer);
......
*(sql + curr) = ')';
curr++;
return curr;
}
ORM, 즉 대상 관계 매 핑, ORM 의 디자인 은 데이터베이스 지구 층 의 디자인 이다.현재 유행 하 는 것 은 성숙 한 ORM 프레임 워 크 로 각종 언어 에 대응 하 는 것 이다.
프로젝트 의 실제 수요 로 인해 가 벼 운 프레임 워 크 를 선택 하 였 습 니 다: Simple MySQL ORM for C.구 글 은 Simple MySQL ORM for C 작가 의 영문 박문 소개 만 발견 했다.http://ales.jikos.cz/smorm/。쌀 을 쳐 서 집안 의 내막 을 재다. 그 문장 이 그리 길지 않 기 때문에 그것 을 번역 해 왔 다.년 전 @ 독 주 일 취 에 대해 언급 한 적 이 있 습 니 다. 그 는 Stack OverFlow 의 에센스 를 번역 한 적 이 있 습 니 다.지금 보면 C + + 에 익숙 하면 외국 프로그래머 커 뮤 니 티 를 충분히 볼 수 있다.한편, 당신 자신 은 프로그래머 이 고 전문 적 으로 말 이 맞 으 며 대부분의 단 어 를 알 고 있 습 니 다.다른 한편, 외국 의 고수 도 많 기 때문에 기술 을 향상 시 키 는 좋 은 기회 가 아니다.마지막 으로 영 어 를 향상 시 키 는 좋 은 방법 이 확실 하 다.
다음은 'Simple MySQL ORM for' 의 번역문 입 니 다.http://ales.jikos.cz/smorm/
C 를 위 한 간단 한 MySQL ORM
저자: alesak
c 버 전 Simple MySQL ORM 은 python 스 크 립 트 로 이 루어 졌 습 니 다. 만 든 MySQL 데이터 베 이 스 를 연결 하여 데이터베이스 시트 에 대응 하 는 데이터 구 조 를 읽 을 수 있 습 니 다. 물론 이 데이터 구조 와 방법 으로 표를 만 들 수도 있 습 니 다.개발 자 들 이 c 언어 를 사용 하여 데이터베이스 에 있 는 데 이 터 를 편리 하 게 업데이트 / 수정 / 삭제 할 수 있 습 니 다.
그 전에 필 자 는 강력 한 데이터 베이스 에 검색 구조 화 데 이 터 를 저장 해 야 한다.필 자 는 MySQL 과 c 언어 를 사용 하 는 경향 이 있다.그러나 필 자 는 자신 이 쓴 거 친 코드 와 인터넷 에서 찾 은 엄 청 난 비용 자원 의 해결 방안 에 싫 증 이 나 서 아예 스스로 썼 다.간단 하고 순진 하 며 붓 이 거칠다.그러나 애인 의 눈 에 서시 가 보인다 고 믿 고 필 자 는 그것 을 좀 더 유용 하 게 만 들 겠 다 고 상상 했다.그리고 그것 에 관 한 문서...
사용 매 뉴 얼 이 아니 라 기술 문장 이라는 점 을 감안 하면.필 자 는 마지막 으로 이 글 에서 언급 한 항목 을 취 소 했 기 때문에 시험 이 필요 하 다.MySQL 의 일부 데이터 형식 은 지원 되 지 않 습 니 다.이 프로젝트 의 원인 중 하 나 는 필자 가 MySQL 이 제공 하 는 c api 를 좋아 하지 않 기 때문에 '더욱 유행 하 는' 모든 것 이 준 비 된 api 를 대신 하 는 것 입 니 다. 그러나 필 자 는 필자 가 아직 완성 하지 못 했 기 때 문 입 니 다.
시작 합 시다.우선, 데이터베이스 테이블 을 만들어 야 합 니 다.필 자 는 이런 방식 을 더욱 좋아한다. 왜냐하면 오직 이렇게 해야만 데이터 베 이 스 를 더욱 충분히 사용 할 수 있 기 때문이다.
CREATE DATABASE ex1;
CREATE TABLE ex_customer (
id int NOT NULL auto_increment,
name char(32),
PRIMARY KEY (id)
);
CREATE TABLE ex_item (
customer_id int,
itemname char(32)
);
다음은 간단 한 python 스 크 립 트 db. py 를 만 듭 니 다.
dbname = "ex1"
name = "db"
tables = { }
다음 에 실행 하 게 합 시다: P
python rdb.py
물론 진정한 rock 보 다 는 청각 적 으로 즐 기지 않 는 다.필 자 는 도대체 데이터 베 이 스 를 어떻게 연결 해 야 하 느 냐 고 물 을 것 이다.물론 그것 은 기본 사용자 가 쓴 것 일 뿐 입 니 다. 하지만 우리 가 얻 은 결 과 를 보 세 요.우 리 는 이미 두 개의 파일 이 생 성 되 었 는데, 각각 db. h 와 db. c 이다.전 자 는 데이터베이스 테이블 을 상징 하 는 데이터 구조 성명 과 이 데이터 구 조 를 조작 하 는 방법 을 포함한다.후 자 는 방법의 정 의 를 포함 하고 이 어 데이터 초기 화 문 구 를 포함한다.어디 보 자.
typedef struct db_ex_customer {
int id;
char * name;
} db_ex_customer;
typedef struct db_ex_item {
int customer_id;
char * itemname;
} db_ex_item;
이 물건 들 을 더 이상 설명 할 필요 가 없다 고 믿는다.사용 합 시다!필 자 는 ex1. c 파일 을 새로 만 들 었 다.주의: 코드 를 쉽게 읽 기 위해 필 자 는 잘못된 반환 값 을 처리 하지 않 았 습 니 다.
#include <db.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
int main (int argc, char **argv)
{
int ret;
MYSQL global_mysql;
MYSQL *m;
db_ex_customer *cust1;
db_ex_item *item1, *item2;
mysql_init (& global_mysql);
/*
* connect to MySQL as usual
*/
m = mysql_real_connect (& global_mysql, "localhost", "root", "", "ex1", 3036, NULL, 0);
/*
* pass the MySQL connection to function, that initializes the "ORM"
*/
ret = db_init (& global_mysql);
/*
* the *__new method creates empty structure
*/
cust1 = db_ex_customer__new ();
/*
* setting the structure attribute with allocated string,
* it will be freed during call of *__free method
*/
cust1->name = strdup ("alesak");
/*
* this method inserts the structure into according table.
* If it has serial field, its value is reflected into structure
*/
ret = db_ex_customer__insert (cust1);
item1 = db_ex_item__new ();
/*
* let's use the serial value from newly inserted customer
*/
item1->customer_id = cust1->id;
item1->itemname = strdup ("simple orm");
ret = db_ex_item__insert (item1);
item2 = db_ex_item__new ();
item2->customer_id = cust1->id;
item2->itemname = strdup ("advanced orm");
ret = db_ex_item__insert (item2);
db_ex_customer__free (cust1);
db_ex_item__free (item1);
db_ex_item__free (item2);
return (0);
}
컴 파일:
cc -I `mysql_config --cflags` ex1.c db.c `mysql_config --libs` -o ex1
실행 가능 한 파일 을 실행 하 니 맞 는 것 같 습 니 다.이것 은 그것 이 이미 일부 데이터 가 저장 되 었 다 는 것 을 의미한다.적어도 그것 을 평가 하 라 고 한다 면 필 자 는 우아 하 다 고 말 할 것 이다.다음은 어떻게 이 데 이 터 를 검색 합 니까?만약 에 우리 가 데이터베이스 테이블 에 기 록 된 키 값 을 알 고 있다 면 필 자 는 ex2. c 파일 을 새로 만 들 었 다.
#define _XOPEN_SOURCE 500
#include <db.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
int main (int argc, char **argv)
{
int ret;
MYSQL global_mysql;
MYSQL *m;
db_ex_customer *cust1;
db_ex_item *item1, *item2;
mysql_init (& global_mysql);
m = mysql_real_connect (& global_mysql, "localhost", "root", "", "ex1", 3036, NULL, 0);
ret = db_init (& global_mysql);
cust1 = db_ex_customer__get_by_id (3);
if (cust1) {
fprintf (stdout, "I have customer named \'%s\'
", cust1->name);
db_ex_customer__free (cust1);
}
return (0);
}
이전 과 같이 컴 파일 한 다음 실행:
cc -I. `mysql_config --cflags` ex2.c db.c `mysql_config --libs` -o ex2
./ex2
마지막 으로 필 자 는 ORM 이 관련 데이터 에 대한 조 회 를 자동 으로 만 들 게 하고 싶 지 않다. 왜냐하면 필 자 는 그것 이 잘 할 수 있다 고 믿 기 때문이다.(솔직히 기본 MyISAM 을 사용 하면 관련 데 이 터 를 판단 할 수 없다).물론, 다음 필 자 는 필자 자신의, 매우 복잡 한 ex 를 새로 만 들 고 싶 습 니 다.items 표 와 excustomer 표 연결 후 SELECT 검색.db. py 편집:
dbname = "ex1"
name = "db"
tables = {
"ex_item" :[("get", "get_customer_items",
[("INTEGER", "customer_id")], "SELECT ex_item.* FROM ex_item WHERE customer_id = ?")]
}
db. puy 스 크 립 트 를 다시 실행 하면 새로운 db 가 추 가 됩 니 다.ex_item__get_customer_items_*방법 집.이러한 방법의 유연성 은 INTEGER 형식의 인 자 를 추가 하여 특정한 SQL 에서 커서 를 열 수 있다 는 점 이다. 커서 에서 한 줄 의 기록 을 읽 고 커서 를 닫 는 것 이다.우리 확장 ex2. c:
#define _XOPEN_SOURCE 500
#include <db.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
int main (int argc, char **argv)
{
int ret;
MYSQL global_mysql;
MYSQL *m;
db_ex_customer *cust1;
db_ex_item *item1, *item2;
mysql_init (& global_mysql);
m = mysql_real_connect (& global_mysql, "localhost", "root", "", "ex1", 3036, NULL, 0);
ret = db_init (& global_mysql);
cust1 = db_ex_customer__get_by_id (3);
if (cust1) {
fprintf (stdout, "I have customer named \'%s\'..
", cust1->name);
db_ex_item__get_customer_items_open (cust1->id);
while ((item1 = db_ex_item__get_customer_items_fetch ()) != NULL) {
fprintf (stdout, ".. and found his item named \'%s\'
", item1->itemname);
db_ex_item__free (item1);
}
db_ex_item__get_customer_items_close ();
db_ex_customer__free (cust1);
}
return (0);
}
원 하 는 것 을 이 루 고 인쇄 한 결과:
I have customer named 'alesak'..
.. and found his item named 'simple orm'
.. and found his item named 'advanced orm'
이상, 여러분!여기http://ales.jikos.cz/smorm/rdb.py 대본더 정확히 말 하면 이 낡은 물건 을 다운로드 하지 마라.그러나 만약 당신 이 이 아 이 디 어 를 좋아한다 면, 필자 에 게 alesak \ # gmail. com 을 알려 주 십시오.전문 이 끝나다.
저자 @ alesak 감사합니다.Simple MySQL ORM for C 는 제 가 직접 테스트 하지 않 았 습 니 다. 시간 을 내 서 테스트 편 을 보충 하 겠 습 니 다.또한 필 자 는 수준 이 제한 되 어 있 으 니 바로 잡 고 벽돌 을 치 는 것 을 환영 합 니 다.이상
훼방 2013 - 3 - 22
http://daoluan.net
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.