'Web_Program'에 해당되는 글 10건

  1. 2023.04.18 장고 마이그레이션시 기존테이블이 있을경우
  2. 2019.07.31 mysql root 패스워드 없이 접속될때 1
  3. 2019.05.10 외래키 제약조건 무시하기
  4. 2018.11.05 오류처리 Exception 'yii\db\Exception' with message 'Error while sending QUERY packet.
  5. 2018.05.01 model migrate 하기
  6. 2010.01.18 jQuery form - select
  7. 2008.10.06 Textarea박스에서 탭키 Tab 효과 주기
  8. 2008.07.31 strtotime 버그 인가? 이전달 구하기
  9. 2008.07.17 파일 다운로드 파일
  10. 2007.02.22 Ajax로 달력 출력

장고 마이그레이션시 기존테이블이 있을경우

|

기존db가 있을경우 마이그레이션
python manage.py makemigrations <app>
python manage.py migrate --fake <app> zero
python manage.py migrate --fake-initial <app>

확인
python manage.py showmigrations

 

 

참고사이트

https://cocook.tistory.com/64

And

mysql root 패스워드 없이 접속될때

|

mysql user테이블에 root유저 필드를 보면 plugin이 있다 unix_socket로 되어있으면 패스워드없이 들어가진다

 

UPDATE mysql.user SET plugin = '' WHERE user = 'root' AND host = 'localhost';

FLUSH PRIVILEGES;

위와같이 없애면 잘 된다

And

외래키 제약조건 무시하기

|

외래키 무시

SET foreign_key_checks = 0;

 

작업 후

 

SET foreign_key_checks = 1;

 

돌려놓기

And

오류처리 Exception 'yii\db\Exception' with message 'Error while sending QUERY packet.

|

  1 [mysqld]

  2 max_allowed_packet=524288000

  3

  4 skip-external-locking

  5 key_buffer_size = 512M

  6 max_allowed_packet = 16M

  7 table_open_cache = 512

  8 sort_buffer_size = 2M

  9 read_buffer_size = 2M

 10 read_rnd_buffer_size = 8M

 11 myisam_sort_buffer_size = 64M

 12 thread_cache_size = 8

 13 query_cache_size = 64M

 14 thread_concurrency = 8

 15 server-id = 1162

 16 binlog_format=mixed

 17 expire_logs_days = 5

 18 user = mysql

 19 skip_name_resolve

 20 log-warnings = 2

 21 slow_query_log

 22 long_query_time = 1

 23 open_files_limit = 2048

 24 skip_slave_start

 25 slave-skip-errors = all

 26 max_heap_table_size = 1G

 27 wait_timeout = 28800



max_allowed_packet=524288000

wait_timeout = 28800


2가지 옵션을 줘본다.


And

model migrate 하기

|


모델 생성

python manage.py makemigrations <appname>

-> create,update,delete등의 변경사항을 migration으로 저장 및 django에 알림

-> 디스크상의 파일로 존재 appname/migrations/0001_initial.py


위의 쿼리를 보고 싶다면?

python manage.py sqlmigrate <appname> 0001

-> 위 숫자는 해당 디렉토리가서 확인하기


실행하기

python manage.py migrate <appname> <위의 숫자>

-> appname, 숫자등은 생략 가능



위의 과정중 오류가 나면 ?

python manage.py migrate --fake <appname>


절대 DB에 들어가 쿼리조작하지말것, 해당앱 migrations 디렉토리가서 파일 삭제하지말것

위 --fake옵션으로 거의 해결가능함






참고자료 : https://docs.djangoproject.com/ko/2.0/intro/tutorial02/



테이블 꼬였을경우 다시 처음부터.... ?





05) 마이그레이션 파일 제거

마이그레이션 파일 제거

Django 마이그레이션 도구는 모델 관리에 훌륭한 도구이다 그러나 너무 많이 저장소에서 관리하는 것이 때로는 불필요한 문제나 부작용을 일으키기도 한다. 그래서 가끔은 마이그레이션 파일을 정리하는 것이 좋다.

첫 번째 시나리오

아직 전혀 배포되지 않은 개발 중인 프로젝트는 중간 중간에 마이그레이션을 싹 지우는 것도 좋다.

마이그레이션 디렉토리 안에 모든 파일을 __init__.py 모듈 빼고 싹 지운다. 리눅스에서는 아래와 같은 명령어로 쉽게 지울 수 있다.

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete

데이터베이스를 제거한다. 기본 SQLite 엔진으로 개발 중이라면 db.sqlite3 파일을 삭제한다.

초기 마이그레이션 파일을 생성하고 데이터베이스 스키마를 생성한다.

python manage.py makemigrations
python manage.py migrate

두 번째 시나리오

마이그레이션 파일은 모두 지우지만 데이터베이스 데이터는 유지하고 싶은 경우이다.

현재 반영 안 된 마이그레이션이 없는지 확인한다.

python manage.py makemigrations

위와 같이 명령하여 아래 메시지를 확인하면 추가로 반영할 마이그레이션이 없는 경우다.

No changes detected

그러나 추가로 마이그레이션 파일이 만들어지면 이를 아래와 같이 명령하여 반영하도록 한다.

python manage.py migrate

프로젝트 앱 마이그레이션 히스토리 삭제

python manage.py showmigrations

위와 같이 명령하면 프로젝트 안에 앱들의 마이그레이션 히스토리를 볼 수 있다.

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
blog
 [X] 0001_initial
 [X] 0002_auto_20170610_1904
 [X] 0003_auto_20170610_1906
 [X] 0004_auto_20170610_2044
 [X] 0005_auto_20170613_1152
 [X] 0006_post_description
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

위 예제에서는 blog 앱의 마이그레이션 파일을아래와 같이 명령하여 초기화한다.

python manage.py migrate --fake blog zero

위 명령어의 결과는 아래와 같다.

Operations to perform:
  Unapply all migrations: blog
Running migrations:
  Rendering model states... DONE
  Unapplying blog.0006_post_description... FAKED
  Unapplying blog.0005_auto_20170613_1152... FAKED
  Unapplying blog.0004_auto_20170610_2044... FAKED
  Unapplying blog.0003_auto_20170610_1906... FAKED
  Unapplying blog.0002_auto_20170610_1904... FAKED
  Unapplying blog.0001_initial... FAKED

다시 아래와 같이 마이그레이션 히스토리를 확인하기 위해 명령할 수 있다.

python manage.py showmigrations

아래 결과에서 blog의 경우에는 마이그레이션 히스토리 앞에 [X] 표시가 사라진 것을 확인할 수 있다.

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
blog
 [ ] 0001_initial
 [ ] 0002_auto_20170610_1904
 [ ] 0003_auto_20170610_1906
 [ ] 0004_auto_20170610_2044
 [ ] 0005_auto_20170613_1152
 [ ] 0006_post_description
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

마이그레이션 파일 삭제

blog 앱의 마이그레이션 디렉토리 안에 __init__.py 파일을 빼고 모두 삭제한다. 그리고 다시 아래와 같이 마이그레이션 히스토리를 확인해본다.

python manage.py showmigrations

그러면 아래와 같이 blog 앱에는 마이그레이션이 없다는 결과를 확인할 수 있다.

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
blog
 (no migrations)
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

초기 마이그레이션 파일 생성

이제 초기 마이그레이션 파일을 만들기 위해 아래와 같이 명령한다.

python manage.py makemigrations

최초 마이그레이션 파일 0001_initial.py이 생성된 것을 확인할 수 있다.

Migrations for 'blog':
  blog\migrations\0001_initial.py
    - Create model Post

페이크 마이그레이션

데이터베이스 테이블이 이미 존재하기 때문에 초기 마이그레이션 파일을 적용할 수 없다. 따라서 마치 마이그레이션을 한 것처럼 아래와 같이 명령하여 페이크 마이그레이션한다.

python manage.py migrate --fake-initial

결과는 다음과 같다.

Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0001_initial... FAKED

그리고 최종 마이그레이션 히스토리를 보면 아래와 같이 blog 앱에는 0001_initial 마이그레이션만 반영된 것으로 확인할 수 있다.

python manage.py showmigrations
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
blog
 [X] 0001_initial
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
sessions
 [X] 0001_initial

요약하면 아래와 같은 순서로 명령한다.

  1. python manage.py makemigrations
  2. python manage.py showmigrations
  3. python manage.py migrate --fake 프로젝트_앱 zero
  4. 마이그레이션 파일 삭제
  5. python manage.py makemigrations
  6. python manage.py migrate --fake-initial




출처 : https://wikidocs.net/9926


And

jQuery form - select

|

<select name='search_code' id='sub_item'>
      <option value="">전체</option>
</select>


name 접근 : var x = $("select[name=search_code]").val(); //select 생략 가능

id 접근 : var x = $("#sub_item > option:selected").val();

아~  완전 걸음마를 하는구나~

And

Textarea박스에서 탭키 Tab 효과 주기

|

코리아인터넷닷컴에 예제를 응용하여 만들었습니다. -_-V

<HTML>
<HEAD>
<script src="http://prototypejs.org/javascripts/prototype.js" type="text/javascript"></script>
<SCRIPT>
function saveCurrentPos (objTextArea) {
   if (objTextArea.createTextRange)
         objTextArea.currentPos = document.selection.createRange().duplicate();
}

function tab_event(objTextArea){
 var text=' ';
 if(event.keyCode==9 && objTextArea.createTextRange){
  var currentPos = objTextArea.currentPos;
  currentPos.text = currentPos.text.charAt(currentPos.text.length - 1) == ' ' ? text + ' ' : text;

 // Event.stop(event); //Prototype
 /* tab Event 없애기 */
  if(!window.Event){
   var Event = new Object();
  }
  if(event.preventDefault){
   event.preventDefault();
   event.stopPropagation();
  }else{
   event.returnValue = false;
   event.cancelBubble = true;
  }
 }
}

</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="myForm">
<TEXTAREA NAME="myTextArea" ROWS="5" COLS="80" WRAP="soft"
       ONSELECT="saveCurrentPos(this)"
       ONCLICK="saveCurrentPos(this)"
       ONKEYUP="saveCurrentPos(this)"
    onkeydown="tab_event(this.form.myTextArea);"
>
이벤트 테스트~!!!!
</TEXTAREA>

</FORM>
</BODY>
</HTML>

And

strtotime 버그 인가? 이전달 구하기

|
오늘이 2008-07-31일이라 하고
원하는 이전달의 값은 2008-06-01이라고 한다면

아래와 같은경우

date('Y-m-01',strtotime('-1 month'));
는 2008-06-01이 나올거 같지만 2008-07-01이 나온다.. -_-;;

그래서 다시 한게 아래다.. 아래로 하면 착하게 원하는 값이 나온다 ^^

$time = time();
date("Y-m-d",mktime(0,0,0,date('m',$time)-1,1,date('Y',$time)));
And

파일 다운로드 파일

|
$filename = $_SERVER['DOCUMENT_ROOT'].'/파일명';
header("Cache-Control: public");
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename='.basename($filename));
header("Content-Type: application/pdf");
header("Content-Transfer-Encoding: binary");
header('Content-Length: '. filesize($filename));
readfile($filename);
And

Ajax로 달력 출력

|

총 4개의 파일로 되어 있습니다.
출력파일, css파일, js파일, php실행파일
달력출력파일에 css,js,php파일을 호출하여 사용하면 됩니다. : )

달력 출력 파일

<form name='x_calendar'>
<input type='hidden' name='xyear' value='<?=date(Y);?>'>
<input type='hidden' name='xmonth' value='<?=date(m);?>'>
</form>
   <?
   echo "<table border='0' cellpadding='5' cellspacing='0' id='t_calendar'>";
   echo "<caption><a href='#' onclick=\"change_calendar('prev',document.x_calendar.xyear.value, document.x_calendar.xmonth.value)\"><</a> <span id='l_year'></span> 년 / <span id='l_month'></span> 월 <a href='#' onclick=\"change_calendar('next',document.x_calendar.xyear.value, document.x_calendar.xmonth.value)\">></a></caption>";
   echo "<tr><td>Sunday</td><td>Monday</td><td>Tuesday</td><td>Wednesday</td><td>Thursday</td><td>Friday</td><td>Saturday</td></tr>";
   echo "</table>";
   ?>
<script>
function change_calendar(division, xyear, xmonth)
{
 AJAX.create();
 AJAX.openXML('POST','statistics_exec.php', true);
 AJAX.setStatusSuccessHandler(calendar_loadData);
 AJAX.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 AJAX.send("division="+division+"&year="+xyear+"&month="+xmonth);
}

 AJAX.create();
 AJAX.openXML('POST','statistics_exec.php', true);
 AJAX.setStatusSuccessHandler(calendar_loadData);
 AJAX.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 AJAX.send(null);
</script>

css 파일

#t_calendar {
  border-collapse:collapse;
  font-size:9pt;
  margin-left: 10px;
}

#t_calendar th { border:1px solid #E6E6E6; background:#D2D2D2; width: 96px;}
#t_calendar td { border:1px solid #E6E6E6;  width: 96px;}


JS파일

var list = new Array();

function calendar_loadData(doc){

 list['start_week'] = doc.getElementsByTagName("start_week");
 list['last_day'] = doc.getElementsByTagName("last_day");
 list['year'] = doc.getElementsByTagName("year");
 list['month'] = doc.getElementsByTagName("month");

 var table = document.getElementById('t_calendar');
 var start_week = list['start_week'][0].firstChild.nodeValue;
 var last_day = list['last_day'][0].firstChild.nodeValue;
 var year = list['year'][0].firstChild.nodeValue;
 var month = list['month'][0].firstChild.nodeValue;
 var ju = 1;
 
 document.getElementById('l_year').innerHTML = year;
 document.getElementById('l_month').innerHTML = month;
 document.x_calendar.xyear.value = year;
 document.x_calendar.xmonth.value = month;
// 열삭제
 for(var i = table.rows.length-1; i > 0; i--){
  table.deleteRow(i);
 }

// 열 생성
 
 //빈셀 생성
 var row = table.insertRow(1);
 for( var i = 0; i < start_week; i++)
 {
  var cell = row.insertCell(i);
  cell.innerHTML = "&nbsp;";
 }
 //셀 생성
 for(var days = 1; days <= last_day; days++)
 {
  if(i%7==0){
   i = 0;
   ju++;
   var row = table.insertRow(ju);
  }
 
  var cell = row.insertCell(i);
  cell.innerHTML = "<sup>"+days+"</sup>";
  i++;
  if(i%7==1)cell.style.color='red';
  if(i%7==0)cell.style.color='blue';
 }
 //빈셀 생성
 while(1){
  if(i%7==0) break;
  var cell = row.insertCell(i);
  cell.innerHTML = "&nbsp;";
  i++;
  if(i%7==0) break;
 }

}

 php파일
<?PHP
 if($division=='prev'){
  $date = date("Y-m-d",mktime(0,0,0,$month-1,1,$year));
 }else if($division=='next'){
  $date = date("Y-m-d",mktime(0,0,0,$month+1,1,$year));
 }else{
  $date = date(Y.'-'.m.'-'.d);
 }

 if( eregi("^[0-9]{4}\-[0-9]{2}\-[0-9]{2}$",$date) ){
  $t = explode("-",$date);
  $year =$t[0];
  $month =$t[1];
  $day =$t[2];
 }else{
  $year = date("Y");
  $month = date("m");
  $day = date("d");
 }

 $timestemp = mktime(0,0,0,$month,1,$year);
 $start_week = date("w",$timestemp);
 $last_day = date("t",$timestemp);
 

header('Content-Type: text/xml');
echo '<?xml version="1.0" encoding="utf-8"?>';

 echo'<calendar>';
 echo'<start_week>'.$start_week.'</start_week>';
 echo'<last_day>'.$last_day.'</last_day>';
 echo'<year>'.$year.'</year>';
 echo'<month>'.$month.'</month>';
while($ob = mysql_fetch_object($res)){
 echo'<sum_day>'.$ob->dates.'</sum_day>';
 echo'<sum_ct>'.$ob->ct.'</sum_ct>';
}

 echo'</calendar>';
?>

And
prev | 1 | next